ELF可执行文件的哪些部分被加载到内存中,在哪里?


10

我已经知道的:

ELF可执行文件包含许多节,显然.text和.data节已加载到内存中,因为这些是程序的主要部分。但是要使程序正常工作,它需要更多信息,尤其是在动态链接时。

我感兴趣的是.plt,.got,.dynamic,.dynsym,.dynstr等部分。ELF中负责将功能链接到地址的部分。

到目前为止,据我所知,诸如.symtab和.strtab之类的内容不会加载(或不保留)在内存中。但是链接器是否使用.dynsym和.dynstr?他们留在记忆中吗?我可以从程序代码访问它们吗?

可执行文件的任何部分都驻留在内核内存中吗?

我对此的兴趣主要是法医,但是有关此主题的任何信息都将有所帮助。我所阅读的有关这些表和动态链接的资源比较高级,它们仅说明工作原理,而与内存中的内容无关。

让我知道我的问题是否有任何不清楚之处。

Answers:


12

以下是一个非常好的参考: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”(然后是相对的)。动态链接器通过搜索所有链接的共享库的.gnu.hash节(或在.hash节中查找没有.gnu的旧共享库)来实现此目的。哈希部分。)一旦在链接的共享库中找到正确的地址,就会将其放入共享库的.got或.plt中。


谢谢,您的链接使我进一步了解了我需要的部分的虚拟映射。由于我对此有兴趣,因此“加载到DRAM”仍然与我相关。如果某个节已映射但从未加载,则无法在内存转储中找到它:)
Dutchy 2013年

你是对的。当您执行内存转储时,您将获得每个映射页面的副本,因此,“映射到vm”和“加载到DRAM”之间的区别是无关紧要的。我删除了该句子,答案得到了改善。谢谢!
Wandering Logic

将您的答案标记为答案,因为这是我所要获得的尽可能多的信息:)剩下的我自己要做,这毕竟是我的研究。
Dutchy

因此,是的。dynsym和.dynstr(及其他)由动态链接器使用,并已加载到程序存储器中(在文本段中),并且可以在运行时由程序使用。
ysdx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.