From 7e6fca90e8bc69c6500ec61a6cc334dd8f682224 Mon Sep 17 00:00:00 2001 From: Sergiu Deitsch Date: Wed, 10 Jan 2024 14:06:18 +0100 Subject: [PATCH] cmake: rework elf detection (#1058) --- CMakeLists.txt | 9 ++++++--- bazel/glog.bzl | 2 ++ src/config.h.cmake.in | 9 +++++++++ src/symbolize.cc | 7 +------ src/symbolize.h | 35 ++++++++++++++--------------------- src/symbolize_unittest.cc | 15 ++++++++------- 6 files changed, 40 insertions(+), 37 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a0b1c056..b787631ce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -125,8 +125,11 @@ if (Unwind_FOUND) endif (Unwind_FOUND) check_include_file_cxx (dlfcn.h HAVE_DLFCN_H) +check_include_file_cxx (elf.h HAVE_ELF_H) check_include_file_cxx (glob.h HAVE_GLOB_H) +check_include_file_cxx (link.h HAVE_LINK_H) check_include_file_cxx (pwd.h HAVE_PWD_H) +check_include_file_cxx (sys/exec_elf.h HAVE_SYS_EXEC_ELF_H) check_include_file_cxx (sys/syscall.h HAVE_SYS_SYSCALL_H) check_include_file_cxx (sys/time.h HAVE_SYS_TIME_H) check_include_file_cxx (sys/types.h HAVE_SYS_TYPES_H) @@ -275,9 +278,9 @@ if (WITH_SYMBOLIZE) set (HAVE_STACKTRACE 1) endif (HAVE_SYMBOLIZE) elseif (UNIX) - cmake_push_check_state (RESET) - check_cxx_symbol_exists (__ELF__ "" HAVE_SYMBOLIZE) - cmake_pop_check_state () + if (HAVE_ELF_H OR HAVE_SYS_EXEC_ELF_H) + set (HAVE_SYMBOLIZE 1) + endif (HAVE_ELF_H OR HAVE_SYS_EXEC_ELF_H) elseif (APPLE AND HAVE_DLADDR) set (HAVE_SYMBOLIZE 1) endif (WIN32 OR CYGWIN) diff --git a/bazel/glog.bzl b/bazel/glog.bzl index 10cf3d2b0..199fe01ed 100644 --- a/bazel/glog.bzl +++ b/bazel/glog.bzl @@ -86,11 +86,13 @@ def glog_library(with_gflags = 1, **kwargs): freebsd_only_copts = [ # Enable declaration of _Unwind_Backtrace "-D_GNU_SOURCE", + "-DHAVE_LINK_H", ] linux_only_copts = [ # For utilities.h. "-DHAVE_EXECINFO_H", + "-DHAVE_LINK_H", ] darwin_only_copts = [ diff --git a/src/config.h.cmake.in b/src/config.h.cmake.in index f60570a44..2347d743a 100644 --- a/src/config.h.cmake.in +++ b/src/config.h.cmake.in @@ -52,6 +52,15 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_SYSLOG_H +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_ELF_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_EXEC_ELF_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LINK_H + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_SYS_SYSCALL_H diff --git a/src/symbolize.cc b/src/symbolize.cc index 09bc9ebe4..11a9872a0 100644 --- a/src/symbolize.cc +++ b/src/symbolize.cc @@ -109,16 +109,11 @@ void InstallSymbolizeOpenObjectFileCallback( } // namespace glog_internal_namespace_ } // namespace google -# if defined(__ELF__) +# if defined(HAVE_LINK_H) # if defined(HAVE_DLFCN_H) # include # endif -# if defined(GLOG_OS_OPENBSD) -# include -# else -# include -# endif # include # include # include diff --git a/src/symbolize.h b/src/symbolize.h index dfd5fec90..d9ca52ddc 100644 --- a/src/symbolize.h +++ b/src/symbolize.h @@ -61,6 +61,14 @@ #include "config.h" #include "glog/platform.h" +#if defined(HAVE_LINK_H) +# include // For ElfW() macro. +#elif defined(HAVE_ELF_H) +# include +#elif defined(HAVE_SYS_EXEC_ELF_H) +# include +#endif + #if defined(GLOG_USE_GLOG_EXPORT) # include "glog/export.h" #endif @@ -72,7 +80,7 @@ #ifndef GLOG_NO_SYMBOLIZE_DETECTION # ifndef HAVE_SYMBOLIZE // defined by gcc -# if defined(__ELF__) && defined(GLOG_OS_LINUX) +# if defined(HAVE_ELF_H) || defined(HAVE_SYS_EXEC_ELF_H) # define HAVE_SYMBOLIZE # elif defined(GLOG_OS_MACOSX) && defined(HAVE_DLADDR) // Use dladdr to symbolize. @@ -86,26 +94,11 @@ #ifdef HAVE_SYMBOLIZE -# if defined(__ELF__) // defined by gcc -# if defined(__OpenBSD__) -# include -# else -# include -# endif - -# if !defined(GLOG_OS_ANDROID) -# include // For ElfW() macro. -# endif +# if !defined(SIZEOF_VOID_P) && defined(__SIZEOF_POINTER__) +# define SIZEOF_VOID_P __SIZEOF_POINTER__ +# endif -// For systems where SIZEOF_VOID_P is not defined, determine it -// based on __LP64__ (defined by gcc on 64-bit systems) -# if !defined(SIZEOF_VOID_P) -# if defined(__LP64__) -# define SIZEOF_VOID_P 8 -# else -# define SIZEOF_VOID_P 4 -# endif -# endif +# if defined(HAVE_ELF_H) || defined(HAVE_SYS_EXEC_ELF_H) // If there is no ElfW macro, let's define it by ourself. # ifndef ElfW @@ -130,7 +123,7 @@ bool GetSectionHeaderByName(int fd, const char* name, size_t name_len, } // namespace glog_internal_namespace_ } // namespace google -# endif /* __ELF__ */ +# endif namespace google { inline namespace glog_internal_namespace_ { diff --git a/src/symbolize_unittest.cc b/src/symbolize_unittest.cc index 30945c141..f07484e63 100644 --- a/src/symbolize_unittest.cc +++ b/src/symbolize_unittest.cc @@ -40,6 +40,7 @@ #include "glog/logging.h" #include "googletest.h" #include "utilities.h" +#include "stacktrace.h" #ifdef GLOG_USE_GFLAGS # include @@ -60,7 +61,8 @@ using namespace google; # define always_inline -# if defined(__ELF__) || defined(GLOG_OS_WINDOWS) || defined(GLOG_OS_CYGWIN) +# if defined(HAVE_ELF_H) || defined(HAVE_SYS_EXEC_ELF_H) || \ + defined(GLOG_OS_WINDOWS) || defined(GLOG_OS_CYGWIN) // A wrapper function for Symbolize() to make the unit test simple. static const char* TrySymbolize(void* pc, google::SymbolizeOptions options = google::SymbolizeOptions::kNone) { @@ -73,8 +75,7 @@ static const char* TrySymbolize(void* pc, google::SymbolizeOptions options = } # endif -# if defined(__ELF__) - +# if defined(HAVE_ELF_H) || defined(HAVE_SYS_EXEC_ELF_H) // This unit tests make sense only with GCC. // Uses lots of GCC specific features. # if defined(__GNUC__) && !defined(__OPENCC__) @@ -449,15 +450,15 @@ __declspec(noinline) void TestWithReturnAddress() { # endif cout << "Test case TestWithReturnAddress passed." << endl; } -# endif // __ELF__ -#endif // HAVE_STACKTRACE +# endif +#endif // HAVE_STACKTRACE int main(int argc, char** argv) { FLAGS_logtostderr = true; InitGoogleLogging(argv[0]); InitGoogleTest(&argc, argv); #if defined(HAVE_SYMBOLIZE) && defined(HAVE_STACKTRACE) -# if defined(__ELF__) +# if defined(HAVE_ELF_H) || defined(HAVE_SYS_EXEC_ELF_H) // We don't want to get affected by the callback interface, that may be // used to install some callback function at InitGoogle() time. InstallSymbolizeCallback(nullptr); @@ -472,7 +473,7 @@ int main(int argc, char** argv) { # else // GLOG_OS_WINDOWS printf("PASS (no symbolize_unittest support)\n"); return 0; -# endif // __ELF__ +# endif // defined(HAVE_ELF_H) || defined(HAVE_SYS_EXEC_ELF_H) #else printf("PASS (no symbolize support)\n"); return 0;