【问题标题】:Difference between Program header and Section Header in ELFELF中程序头和节头的区别
【发布时间】:2014-06-16 06:56:36
【问题描述】:

Q1 ELF中Program header和Section Header有什么区别?

Q1.1 段和段有什么区别?

我相信 pheaders 只指向部分。

第二季度。文件头和程序头有什么区别?

根据 GNU ld 链接器脚本,Using Id: The GNU Linker:

PHDRS
{
name type [ FILEHDR ] [ PHDRS ] [ AT ( address ) ]
[ FLAGS ( flags ) ] ;
}

您可以使用 FILEHDR 和 PHDRS 关键字出现在程序头类型之后以进一步 描述段的内容。 FILEHDR 关键字表示该段应包括 ELF 文件头。 PHDRS 关键字表示该段应包含 ELF 程序 标题本身。

这有点令人困惑。

【问题讨论】:

标签: c arm gnu elf linker-scripts


【解决方案1】:

Executable & Linkable Format wikipage 有一张很好的图片来解释 ELF,以及它的程序头和节头之间的区别。另见elf(5)

[初始] 程序头定义了在 execve(2) 时间投射到 virtual memory(可执行文件的观点)的段(在运行该 ELF 可执行文件的 processaddress space 中)。 [final] 部分标题定义部分(可链接的观点,对于ld(1) 等...)。每个部分都属于一个段(并且在执行时可能是可见的,也可能是不可见的——即映射到内存中)。 ELF 文件头告诉程序头表和节头表在哪里。

还可以使用 objdump(1)readelf(1) 来探索 Linux 系统上存在的多个 ELF 文件(可执行文件、共享对象、可链接对象)。

Levine 的 Linkers & Loaders 书中有一章详细解释了这一点。

而且Drepper的论文How to Write Shared Libraries也有一些很好的解释。

【讨论】:

  • 但我的回答仍然合适。仔细阅读并点击链接。
  • 亲爱的 Basile,它并没有说明程序头。我正在寻找有关 PHDRS { name type [FILEHDR] [PHDRS] [AT (address)] [FLAGS (flags)] 用法的详细信息; }
  • 总结:运行时间加载时间。未分配的部分(调试信息),不在 ELF 中但在运行时分配的 BSS 部分(NOLOAD)。类似的概念/关键字是 VMALMA
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 2020-08-15
  • 1970-01-01
  • 2014-03-21
  • 2011-10-01
  • 2013-02-11
  • 1970-01-01
相关资源
最近更新 更多