我用-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'
为什么这有用?
答案 0 :(得分:3)
我很惊讶地发现LOAD段的偏移量是0x000000
你为什么感到惊讶?
因为这意味着可执行标头将与文本段同时加载到内存中。
正确。为什么这是一个问题?
正如this answer所述,可执行文件为mmap
,mmap
适用于整个页面;您无法从偏移0x34
开始绘制页面的一部分。
你可以构建一个可执行文件,其中.text
从偏移4096
开始(在ELF头和程序头和文本之间留下一个大洞),然后这样可执行文件可以包含偏移PT_LOAD
的第一个4096
段。这通常不常做:文件中浪费的空间通常不值得保存52个字节的内存。