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可以让您在文件中的任何位置指定偏移量