如果.symtab
已经包含了所有内容,为什么还要有两个符号表.dynsym
?
为什么有两个符号表?
逆向工程
linux
小精灵
2021-06-18 10:35:19
1个回答
简短的回答是.dynsym
动态链接器(也称为运行时加载器或 RTLD)在程序加载时使用该表来确定将哪些 DLL 映射到正在加载到内存中的程序的地址空间。结果,该.dynsym
部分被映射到可加载段(具体而言,该text
段)并因此在内核加载程序段时包含在虚拟内存中的运行时进程映像中。作为这一点的反映,Sys V ABI 实际上要求动态链接数组包含动态符号哈希表、符号和库名称的字符串表以及动态符号表。
另一方面,.symtab
进程创建不需要该段,它没有映射到可加载段,因此在程序执行时不会加载到内存中,因此可以与段信息一起删除。
以下文章更详细地讨论了动态链接及其要求:
关于为 Linux 创建一些很小的 ELF 可执行文件的旋风教程(或者,“好吧,也许大小不是一切”)
在这里,作者着手创建尽可能小的动态链接 ELF 二进制文件,其中仅包含程序成功加载和执行所需的内容。
-
讨论了动态链接的过程及其要求,以解释插入代码洞的代码如何调用库函数。
-
使用 r2 和通过
sstrip
.
有关更多信息,请参阅 Sys V ABI 的第 5 章 -“程序加载和动态链接”,以及 LWN 文章程序如何运行:ELF 二进制文件 。