为什么 ELF header 与文本段一起加载到内存中?

2023-12-24

我编译了这个程序-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'

为什么这有用?


我很惊讶地发现 LOAD 段上的偏移量是 0x000000

你为什么感到惊讶?

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

正确的。为什么这是一个问题?

As 这个答案 https://stackoverflow.com/a/42616451/50617解释一下,可执行文件是mmaped and mmap致力于entire页面;您无法映射从偏移量开始的页面部分0x34.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 ELF header 与文本段一起加载到内存中? 的相关文章

随机推荐