#ifdef CPPTRACE_GET_SYMBOLS_WITH_LIBDL #include #include "symbols.hpp" #include #include #include #include namespace cpptrace { namespace detail { namespace libdl { stacktrace_frame resolve_frame(const frame_ptr addr) { Dl_info info; if(dladdr(reinterpret_cast(addr), &info)) { // thread-safe auto base = get_module_image_base(info.dli_fname); return { addr, base.has_value() ? addr - reinterpret_cast(info.dli_fbase) + base.unwrap_value() : 0, nullable::null(), nullable::null(), info.dli_fname ? info.dli_fname : "", info.dli_sname ? info.dli_sname : "", false }; } else { return { addr, 0, nullable::null(), nullable::null(), "", "", false }; } } std::vector resolve_frames(const std::vector& frames) { std::vector trace; trace.reserve(frames.size()); for(const auto frame : frames) { trace.push_back(resolve_frame(frame)); } return trace; } } } } #endif