1

我正在 Linux 中进行动态二进制分析。鉴于程序是动态链接的(加载时链接)并且没有地址空间随机化,如果正在调用标准库函数,我必须解析函数名称。我在反汇编代码中看到,对标准库例程的调用首先分支到 .plt 部分中的某个地址,PC 正在加载那里计算的内存地址。顺便说一句,它在 ARM Linux 中,但我猜一般的想法是一样的。

我是系统编程的新手。我不太了解库是如何链接的以及在运行时如何解析地址。专家的任何想法表示赞赏。

4

1 回答 1

3

PLT 代表过程链接表,该表将共享库中的函数(和全局变量)解析为程序中的地址。

PLT 与 GOT(全球偏移表)密切相关。如果调用共享库中的地址,它们一起执行惰性绑定:在第一次调用时,函数的实际地址被解析(即使没有地址随机化,每次执行也可能不同,这取决于库的顺序加载/使用),在进一步的调用中,地址间接与 GOT 一起使用。

您可以使用 和 之类的工具objdumpreadelf检查 elf 文件的内容。一些更详细的解释在这里:

http://www.technovelty.org/linux/pltgot.html

http://timetobleed.com/dynamic-linking-elf-vs-mach-o/

于 2012-09-13T08:15:47.673 回答