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

标签 linux assembly native-code systems-programming

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

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

最佳答案

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

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

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

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

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

关于linux - 解析共享库中的符号名称 (Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12399411/

相关文章:

linux - 将 GIT 与 Jenkins 集成

c - 二进制字节在 Linux 串行通信中被误认为是新行

c - 为什么声明到 main 函数中的局部字符串是 Rodata 段内存的一部分?

c# - 在 Azure 辅助角色中使用 kernel32 CreateThread/TerminateThread

android - 使用 NDK( native 代码)的应用程序下降。我怎样才能找出原因?

java - 为什么字节码可能比 native 代码运行得更快

linux - 如何提高linux中的EXT4时间戳精度?

java - 当在 Java 中的 Linux 服务器中选择日语时,下载 CSV 文件头会变得垃圾

string - 如何在 .COM 可执行文件中以相反顺序打印字符串?

java - 编译器 asm 字节码表达式