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

时间:2017-04-29 19:40:33

标签: c linux elf

我用-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'

为什么这有用?

1 个答案:

答案 0 :(得分:3)

  

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

你为什么感到惊讶?

  

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

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

正如this answer所述,可执行文件为mmapmmap适用于整个页面;您无法从偏移0x34开始绘制页面的一部分。

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