我正在 Linux 中进行动态二进制分析。 鉴于程序是动态链接的(加载时链接)并且没有地址空间随机化,如果调用标准库函数,我必须解析函数名称。我在反汇编代码中看到,调用标准库例程首先分支到 .plt 部分中的某个地址,PC 正在加载那里计算的内存地址。顺便说一句,它在 ARM Linux 中,但我想总体思路是一样的。
我是系统编程的新手。我不太了解库是如何链接的,地址是如何在运行时解析的。专家的任何想法表示赞赏。
最佳答案
PLT 代表过程链接表,该表将共享库中的函数(和全局变量)解析为程序中的地址。
PLT 与 GOT(全局偏移表)密切相关。如果调用共享库中的地址,它们一起执行惰性绑定(bind):在第一次调用时,函数的实际地址被解析(即使没有地址随机化,它也可能与每次执行不同,这取决于按照加载/使用库的顺序),在进一步的调用中,该地址将间接与 GOT 一起使用。
您可以使用objdump
和readelf
等工具来检查elf 文件的内容。这里有一些更详细的解释:
关于linux - 解析共享库中的符号名称 (Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12399411/