如何定位ELF共享库中指定偏移量对应的符号?

How to locate what symbol corresponds to a specified offset in an ELF shared library?

我有一个链接到 ELF 共享库的应用程序。它使用的库已删除所有不需要的符号(使用 strip --strip-unneeded)。我正在尝试调试堆损坏问题。我有一个由 glibc 的 malloc() 实现生成的堆栈跟踪,其中包含一堆这样的条目:

/lib/libfoo.so.0(+0x1c4853)[0x7fe5ae6c8853]
/lib/libfoo.so.0(+0x1dc094)[0x7fe5ae6e0094]
/lib/libfoo.so.0(+0x1d7902)[0x7fe5ae6db902]

这些显然不是很有用。在我的开发机器上(它与发生错误的机器是分开的,而且我没有准备好访问该系统),我有一个尚未被剥离的库副本。我可以轻松地将上述符号偏移量映射到它们出现的相应函数吗?作为奖励,如果我可以将它们映射到源行号,那就更好了。

没有提供,然后删除,正确答案如下:

您可以为此使用 addr2line 工具,它是 binutils 的一部分,因此它应该已经安装在您的系统上。

addr2line -e /path/to/libfoo.so.0 -fp 0x1c4853

输出应该类似于

some_function at /dev/src/main.c:11