我编译了这个程序-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解释一下,可执行文件是mmap
ed and mmap
致力于entire页面;您无法映射从偏移量开始的页面部分0x34
.
You could构建一个可执行文件,其中.text
从偏移量开始4096
(在ELF头和程序头和文本之间留下一个大洞),然后这样的可执行文件可以有第一个PT_LOAD
带偏移量的段4096
。这种做法并不常见:文件中浪费的空间通常不值得节省 52 字节的内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)