如何查看正在运行的进程的动态符号表?

逆向工程 linux 符号
2021-06-19 00:22:34

对于 Linux 上的任何动态可执行文件,都有一个动态链接器可以将当前符号绑定存储在某处。因此,当加载新库时,它知道是否绑定符号。

例如,当两个共享对象包含相同的符号时,第一个加载的将绑定该符号,后续加载不会重新绑定该符号。

所以这意味着内存中应该有一个寄存器来存储当前的绑定。我怎样才能访问它?它有什么格式?它的便携性如何(我的列出符号的程序在其他计算机上运行的可能性有多大)?

1个回答

保存已加载共享对象列表的结构被调用link_map并存储在动态链接器(rtld 或 ld.so,取决于平台)中。

AFAIK 没有官方标准,但最常见的实现 (glibc) 使用该GOT[1]条目来存储指向链接映射的指针,并且 PLT 存根将其传递给动态符号解析器(通过跳转到 中的地址GOT[2])。

这是一篇很棒的文章,概述了所有这些以及对其他地方的更多参考:

http://s.eresi-project.org/inc/articles/elf-rtld.txt

我建议您为 glibc 安装符号+源代码并逐步执行 gdb 中的动态调用以查看它们是如何解决的,或者甚至只是“离线”阅读源代码。