【问题标题】:Resolving symbol name in Shared library (Linux)解析共享库中的符号名称 (Linux)
【发布时间】:2012-09-13 04:26:28
【问题描述】:

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

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

【问题讨论】:

    标签: linux assembly native-code systems-programming


    【解决方案1】:

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

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

    您可以使用objdumpreadelf 等工具来检查elf 文件的内容。更详细的解释在这里:

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

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

    【讨论】:

    • 非常感谢您的回答。
    猜你喜欢
    • 2010-10-17
    • 2014-03-06
    • 2011-02-28
    • 2011-04-25
    • 2010-12-09
    • 2011-10-03
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多