为什么程序头可执行?

eye*_*and 6 linux elf

我在我的linux机器上的几个二进制文件上使用了readelf,并在程序头中看到了令我惊讶的东西.这个示例来自'ld'实用程序,但它也出现在我使用gcc编译的任何内容中.

PHDR 0x000034 0x08048034 0x08048034 0x00120 0x00120 RE 0x4

该段跨越整个程序头.为什么被标记为可执行文件?它不包含机器代码.但是,为什么甚至在标题中出现?我真的不想在我的程序图像中.

Sim*_*ter 5

指向 PHDR 的 PHDR 告诉加载程序 PHDR 本身应该映射到进程地址空间,以便程序本身可以访问它们。

这主要用于动态链接。

内存被标记为可执行的原因是因为 PHDR 小于一页,并且紧挨着可执行代码的开头。如果 PHDR 的权限与程序文本的权限不同,则链接器必须在它们之间插入填充。

  • 内存是可执行的,因为 PHDR 小于一页,并且紧挨着可执行代码的开头。如果 PHDR 的权限与程序文本的权限不同,则链接器必须在它们之间插入填充。 (4认同)
  • 程序链接的任何动态库都可以被动态加载插件的版本替换,因此动态链接的程序将始终能够在执行期间加载共享对象,因此需要存在 PHDR。 (2认同)