如果.symtab已经包含.dynsym中的所有内容,为什么还要有两个符号表?

评论

AFAIR一个用于调试符号,另一个用于动态链接器,但是我必须继续阅读。不过,也许其他人会更快回答。

#1 楼

简短的答案是动态链接程序(也称为运行时加载程序或RTLD)在程序加载时使用.dynsym表,以确定哪些DLL映射到要加载到内存中的程序的地址空间中。结果,.dynsym部分被映射到可加载段(特别是text段),因此当内核加载程序段时,会将其包括在虚拟内存中的运行时过程映像中。为此,Sys V ABI实际上要求动态链接数组包含动态符号哈希表,用于符号和库名称的字符串表以及动态符号表。

一方面,不需要.symtab部分来创建进程,它没有映射到可加载的段,因此在执行程序时不会加载到内存中,因此可以将其与部分信息一起删除。 >动态链接及其要求在以下文章中进行了详细讨论:大小并不是全部”“

作者在这里着手创建最小的动态链接的ELF二进制文件,其中仅包含程序成功加载和执行所需的二进制文件。


欺骗ELF

讨论了动态链接的过程及其要求,以解释如何将插入代码洞穴的代码制作成对库函数的调用。


ELF:动态挣扎有关详细信息,请参阅Sys V ABI的第5章-“程序加载和动态链接”,以及LWN文章如何运行程序:ELF。有关详细信息,请参见sstrip。二进制文件