C++ 在静态链接二进制文件中获取进程内回溯

C++ 在静态链接二进制文件中获取进程内回溯,c++,c,stack-trace,backtrace,C++,C,Stack Trace,Backtrace,Glibc提供了backtrace()和backtrace\u symbols()用于从进程内访问堆栈跟踪,与调试符号无关。但是,根据,静态链接的二进制文件将忽略必要的.dynsym部分,即使已传递标志-rdynamic 我知道一些基于调试符号的方法,使用ELF-utils中的libdwarf或libdw。出于二进制大小(以及相关的编译时间)和许可(针对特定提到的库)的原因,我不希望依赖这些。看起来libunwind依赖于相同的动态符号表进行命名:您是否尝试使用--export dynamic?

Glibc提供了
backtrace()
backtrace\u symbols()
用于从进程内访问堆栈跟踪,与调试符号无关。但是,根据,静态链接的二进制文件将忽略必要的
.dynsym
部分,即使已传递标志
-rdynamic


我知道一些基于调试符号的方法,使用ELF-utils中的
libdwarf
libdw
。出于二进制大小(以及相关的编译时间)和许可(针对特定提到的库)的原因,我不希望依赖这些。看起来
libunwind
依赖于相同的动态符号表进行命名:您是否尝试使用
--export dynamic
?这正是将
-rddynamic
传递到编译器驱动程序将导致它传递到链接器的原因。除非您建议链接器在显式传递它时执行我想要的操作,而编译器驱动程序在为静态二进制文件调用链接器时会抑制它?也就是说,您是否建议我尝试使用
-Wl,-export dynamic
而不是
-rdynamic
?libunwind在静态链接的可执行文件中工作。它提供符号名,还是仅提供地址?如果它提供了符号名,那么从glibc
backtrace()中获取它们的位置是什么
不是吗?看起来
libunwind
依赖于相同的动态符号表进行命名:您是否尝试使用
--export dynamic
?这正是将
-rddynamic
传递到编译器驱动程序将导致它传递到链接器的原因。除非您建议链接器在显式传递它时执行我想要的操作,而编译器驱动程序在为静态二进制文件调用链接器时会抑制它?也就是说,您是否建议我尝试使用
-Wl,-export dynamic
而不是
-rdynamic
?libunwind在静态链接的可执行文件中工作。它提供符号名,还是仅提供地址?如果它提供的是符号名,那么它从哪里获得它们的glibc
backtrace()
不是吗?