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