From 24e64ab38597c25c0c98e8565184143d1ce192de Mon Sep 17 00:00:00 2001 From: Jeremy <51220084+jeremy-rifkin@users.noreply.github.com> Date: Sun, 19 Nov 2023 23:17:11 -0600 Subject: [PATCH] Check for _dl_find_object support --- CMakeLists.txt | 8 ++++++++ cmake/has_dl_find_object.cpp | 6 ++++++ src/binary/safe_dl.hpp | 12 ++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 cmake/has_dl_find_object.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 56996ec..fa58e9d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -78,6 +78,10 @@ if(NOT WIN32 OR MINGW) check_support(HAS_CXX_EXCEPTION_TYPE has_cxx_exception_type.cpp "" "" "") endif() +if(UNIX AND NOT APPLE) + check_support(HAS_DL_FIND_OBJECT has_dl_find_object.cpp "" "" "") +endif() + # =============================================== Autoconfig unwinding =============================================== # Unwind back-ends if( @@ -276,6 +280,10 @@ if(HAS_CXX_EXCEPTION_TYPE) target_compile_definitions(${target_name} PUBLIC CPPTRACE_HAS_CXX_EXCEPTION_TYPE) endif() +if(HAS_DL_FIND_OBJECT) + target_compile_definitions(${target_name} PUBLIC CPPTRACE_HAS_DL_FIND_OBJECT) +endif() + # Symbols if(CPPTRACE_GET_SYMBOLS_WITH_LIBBACKTRACE) if(NOT HAS_BACKTRACE) diff --git a/cmake/has_dl_find_object.cpp b/cmake/has_dl_find_object.cpp new file mode 100644 index 0000000..a75ca53 --- /dev/null +++ b/cmake/has_dl_find_object.cpp @@ -0,0 +1,6 @@ +#include + +int main() { + dl_find_object result; + _dl_find_object(reinterpret_cast(main), &result); +} diff --git a/src/binary/safe_dl.hpp b/src/binary/safe_dl.hpp index 36cab12..d43e2ce 100644 --- a/src/binary/safe_dl.hpp +++ b/src/binary/safe_dl.hpp @@ -12,6 +12,7 @@ #include #include +#if CPPTRACE_HAS_DL_FIND_OBJECT #if IS_LINUX || IS_APPLE #include #include @@ -55,5 +56,16 @@ namespace detail { } } } +#else +namespace cpptrace { +namespace detail { + inline void get_minimal_object_frame(frame_ptr address, minimal_object_frame* out) { + out->raw_address = 0; + out->address_relative_to_object_base_in_memory = 0; + out->object_path[0] = 0; + } +} +} +#endif #endif