解析共享库中的符号名称(Linux)

时间:2012-09-13 04:26:28

标签: linux assembly native-code systems-programming

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

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

1 个答案:

答案 0 :(得分:3)

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

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

您可以使用objdumpreadelf等工具来检查精灵文件的内容。这里有一些更详细的解释:

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

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