C 为什么ELF头和文本段一起加载到内存中?

C 为什么ELF头和文本段一起加载到内存中?,c,linux,elf,C,Linux,Elf,我用-m32-nostlib将这个程序编译成一个ELF可执行文件: void _start() {} 当我执行readelf-l时,我惊讶地发现加载段上的偏移量为0x000000,因为这意味着可执行头将与文本段同时加载到内存中。因此,我与GDB进行了核实,事实确实如此: (gdb) b _start Breakpoint 1 at 0x8048083 (gdb) r Starting program: /home/tbodt/ish/build/a.out Breakpoint 1, 0x

我用
-m32-nostlib
将这个程序编译成一个ELF可执行文件:

void _start() {}
当我执行
readelf-l
时,我惊讶地发现加载段上的偏移量为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'
这为什么有用

我惊讶地看到加载段上的偏移量是0x000000

你为什么感到惊讶

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

对。为什么这是个问题

如前所述,可执行文件是
mmap
ed,
mmap
在整个页面上工作;无法映射从偏移量
0x34开始的部分页面


您可以构建一个可执行文件,其中
.text
从偏移量
4096
开始(在ELF头和程序头与文本之间留下一个大洞),然后这样的可执行文件可以具有偏移量
4096
的第一个
PT\u加载
段。这是不常见的:文件中浪费的空间通常不值得保存52字节的内存。

也许动态链接器代码需要查看ELF头。这有什么奇怪的吗?@JohnBollinger我不知道为什么在内存中保存头是有用的,如果没有很好的理由让头出现,我希望偏移量为0x83,入口点为0x8048000oh,我认为mmap可以让您在文件中的任何位置指定偏移量