Dut*_*chy 11 linux memory dynamic-linking elf dynamic-loading
我已经知道的:
ELF 可执行文件有许多部分,显然 .text 和 .data 部分被加载到内存中,因为它们是程序的主要部分。但是要使程序正常工作,它需要更多信息,尤其是在动态链接时。
我感兴趣的是 .plt、.got、.dynamic、.dynsym、.dynstr 等部分。ELF 中负责将函数链接到地址的部分。
从我到目前为止已经能够弄清楚的是,像 .symtab 和 .strtab 这样的东西不会被加载(或不会留在)内存中。但是链接器使用 .dynsym 和 .dynstr 吗?他们留在记忆中吗?我可以从程序代码访问它们吗?
是否有驻留在内核内存中的可执行文件的任何部分?
我对此的兴趣主要是法医,但有关此主题的任何信息都会有所帮助。我读过的关于这些表和动态链接的资源更高级,它们只解释了工作原理,而不是关于内存中的内容的任何实用内容。
如果我的问题有任何不清楚的地方,请告诉我。
Wan*_*gic 13
以下是一个非常好的参考:http : //www.ibm.com/developerworks/linux/library/l-dynamic-libraries/。它在不同级别的各种不同参考文献的末尾包含参考书目。如果你想知道每一个血腥的细节,你可以直接去源:http : //www.akkadia.org/drepper/dsohowto.pdf。(Ulrich Drepper 编写了 Linux 动态链接器。)
通过运行“objdump -h myexe”或“readelf -S myexe”之类的命令,您可以获得可执行文件中所有部分的非常好的概览。
.interp 部分包含将用于动态链接此对象中的符号的动态加载器的名称。.dynamic 部分是对程序头的一个提炼,它被格式化为易于动态加载器阅读。(所以它有指向所有其他部分的指针。)
.got(全局偏移表)和 .plt(过程链接表)是动态链接器操作的两个主要结构。.got 是变量的间接表,.plt 是函数的间接表。每个可执行文件或库(称为“共享对象”)都有自己的 .got 和 .plt,这些是该共享对象引用的符号表,这些符号实际上包含在某个其他共享对象中。
.dynsyn 包含有关共享对象中符号的所有信息(您定义的符号和需要引用的外部符号)。.dynsyn 不包含实际的符号名称。这些包含在 .dynstr 中,而 .dynsyn 有指向 .dynstr 的指针。.gnu.hash 是一个哈希表,用于按名称快速查找符号。它还只包含指针(指向 .dynstr 的指针,以及用于制作桶链的指针。)
当您的共享对象取消引用某个符号“foo”时,动态链接器必须在您链接的所有动态对象中查找“foo”,以确定哪个包含您正在寻找的“foo”(然后是相对的“foo”的地址在该共享对象内。)动态链接器通过搜索所有链接共享对象的 .gnu.hash 部分(或 .hash 部分查找没有 .gnu 的旧共享对象)来实现这一点。 hash 部分。)一旦它在链接的共享对象中找到正确的地址,它就会将其放入共享对象的 .got 或 .plt 中。