如何使用linux中的链接寄存器(如backtrace_symbol)从函数地址中检索函数名

时间:2016-04-18 05:21:55

标签: c linux arm

我想写c程序(比如回溯)我得到了函数的地址,但我不知道如何将这些地址转换为符号(函数名)。请帮帮我

1 个答案:

答案 0 :(得分:1)

第一个答案是符号处理是隐藏的内部ABI。有些操作系统甚至在内核空间中执行此魔术。但你显然想要ARM + linux。

首先需要的信息是将地址映射回原点。您可以从此处检索此映射:/ proc / self / stat

下一部分更棘手,将这些文件的偏移转换为符号。为此,您需要解析ELF文件。如果您不想解析二进制数据,可以欺骗并使用objdump并解析ASCII格式的数据

http://man7.org/linux/man-pages/man5/elf.5.html
objdump -t -T -r -R /lib/x86_64-linux-gnu/libnss_files-2.19.so

如果你想要比这更多的细节信息,你将需要解析包含调试信息的部分(如果存在) - 它可能被移动到一个单独的文件以允许apt拥有那些漂亮的-dbg包,但是可能是很多工作的方式,而且更容易破解gdb或从像valgrind这样的项目中提取代码。

PS:如果您的用例是在出现问题时执行调试/诊断,我建议使用valgrind