说我有__builtin_return_address(0)
获得的地址。
一段时间后,我想将其翻译为coreesponding函数名。
There's dladdr(3)
仅适用于动态库。
有没有办法接收任何符号的功能(可能是libunwind,backrace_symbol()等)?
答案 0 :(得分:1)
使用调试信息(-g
)编译所有代码(甚至可能是您使用的某些共享库)。请注意,GCC可以使用 -g
和一些优化标记,例如-O2
(当然,在这种情况下,调试信息是“近似”)。因此,您可以使用gcc -Wall -g -O2
等编译代码....
然后使用Ian Taylor的libbacktrace,它包含在最近的GCC版本中。
BTW,dladdr
或backtrace_symbol
也可能有效(但我建议使用libbacktrace
,因为它正在解析DWARF信息)。 dladdr(3)确实可以处理来自可执行文件本身的符号。您可能需要将可执行文件与-rdynamic
标记链接。
另请注意ELF可执行文件中static
符号(特别是static
函数)“并不存在”(仅全局符号保留在因此dladdr
无法给予他们。另请注意visibility
函数attribute和pragma。