【问题标题】:Why is the ELF header loaded into memory along with the text segment?为什么 ELF 标头与文本段一起加载到内存中?
【发布时间】:2017-04-29 19:40:32
【问题描述】:

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

为什么有用?

【问题讨论】:

  • 也许动态链接器代码需要查看 ELF 标头。
  • 这有什么奇怪的?
  • @JohnBollinger 我只是不确定为什么将标头放在内存中很有用,如果没有充分的理由让标头在那里,我希望偏移量为 0x83 并且入口点只是 0x8048000

标签: c linux elf


【解决方案1】:

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

你为什么感到惊讶?

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

正确。为什么会有这样的问题?

正如this answer 解释的那样,可执行文件是mmaped,mmap 可以在整个页面上运行;您不能从偏移量 0x34 开始映射页面的一部分。

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

【讨论】:

  • 哦,我以为 mmap 可以让您在文件中的任何位置指定偏移量
猜你喜欢
  • 2017-01-22
  • 1970-01-01
  • 2018-01-23
  • 2012-05-12
  • 1970-01-01
  • 2021-02-25
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多