ELF可执行文件的加载

4
在ELF文件格式规范的第2-7页和第2-8页中,有两张图片展示了一个可执行文件的程序头以及它们如何被加载到内存中:specification of the ELF file format
规范解释道:
尽管示例文件的文件偏移量和虚拟地址对于文本和数据都是模4 KB同余的,但最多四个文件页面包含不纯的文本或数据(取决于页面大小和文件系统块大小)。
第一个文本页面包含ELF标头、程序头表和其他信息。
最后一个文本页面保存了数据开头的副本。
第一个数据页面有一个文本结束的副本。
最后一个数据页面可能包含与运行进程无关的文件信息。
我的问题是:
1. 第i个“文本页面”和“数据页面”是什么意思?
2. 上述四个语句中的第二和第三项是什么意思?
3. 为什么数据填充出现在文本段之后,而文本填充出现在数据段之前,形成交错布局?
4. 如果可执行文件有超过两个段(除了文本和数据)需要加载怎么办?
1个回答

4

页面是虚拟内存中最小的可映射单元。如果您对基础知识不熟悉,请参阅维基百科上关于虚拟内存的文章。在常见系统中,页面的大小为4096字节,或0x1000十六进制。

“文本页面”包含可执行代码;“数据页面”包含数据。这些必须映射到固定地址,以使代码中的偏移量正确。在共享库或位置无关可执行文件中,不再指定确切的虚拟地址,而是指定它们的相对位置。在此示例中,第0个文本页面从0x8048000到0x8048fff,位于文本段的开始之前(在0x8048100处)。第1个文本页面从0x8049000到0x8049fff。最后一个文本页面从0x8073000到0x8073fff,超出了文本段的末尾(在0x8073eff处)。

第一个数据页面位于0x8074000,但数据段直到0x8074f00才开始。这个页面由文件的同一部分支持,但必须分别映射,因为它具有不同的权限(PROT_EXEC|PROT_READ vs PROT_READ)。这就是所谓的“数据开始部分的副本”/“文本结束部分的副本”的含义。

如果有两个以上的段,则完全相同地加载。 “文本”和“数据”是完全任意的,重要的是为每个段指定的标志和地址。您可以使用readelfobjdump查看此信息。

请注意,在现实世界中,通常存在未映射的空间(“孔”),尽管不一定在只读数据和读写数据之间或已初始化与未初始化数据之间存在。

例如,运行cat /proc/self/maps会给我:

ben@joyplim ~ % cat /proc/self/maps
00400000-0040c000 r-xp 00000000 fe:01 36176026                           /bin/cat
0060b000-0060c000 r--p 0000b000 fe:01 36176026                           /bin/cat
0060c000-0060d000 rw-p 0000c000 fe:01 36176026                           /bin/cat
<plus the heap, stack, library, and special kernel stuff>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接