为什么ELF头和代码段一起加载到内存中?

5

我使用-m32 -nostdlib编译了这个程序,生成了一个ELF可执行文件:

void _start() {}

当我运行 readelf -l 命令时,惊讶地发现 LOAD 段的偏移量为 0x000000,这意味着可执行文件头将与文本段同时加载到内存中。于是我使用 GDB 进行了核实,发现确实如此。

(gdb) b _start
Breakpoint 1 at 0x8048083
(gdb) r
Starting program: /home/tbodt/ish/build/a.out 

Breakpoint 1, 0x08048083 in _start ()
(gdb) x/4c 0x08048000
0x8048000:      127 '\177'      69 'E'  76 'L'  70 'F'

这有何用处?

也许动态链接器代码需要查看ELF头。 - Barmar
1
这有什么令人惊讶的? - John Bollinger
1
@JohnBollinger 我只是不确定将头放在内存中有什么用处,如果没有很好的理由使头部出现,我会期望偏移量为0x83,入口点只需为0x8048000。 - tbodt
1个回答

3

我惊讶地发现LOAD段的偏移量为0x000000。

你为什么感到惊讶?

因为这意味着可执行头将与文本段同时加载到内存中。

是的,那有什么问题吗?

正如这个答案所解释的那样,可执行文件被映射并且mmap作用于整个页面;您不能从偏移量0x34开始映射页面的一部分。

您可以构建一个可执行文件,其中.text从偏移量4096开始(在ELF头和程序头和文本之间留下大空白),然后这样的可执行文件可以具有第一个PT_LOAD段,其偏移量为4096。但这通常不会这样做:文件中的浪费空间通常不值得节省52字节的内存。


2
哦,我以为mmap可以让你在文件中的任何位置指定一个偏移量。 - tbodt

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