ELF中程序头和节头的区别

Posted

技术标签:

【中文标题】ELF中程序头和节头的区别【英文标题】:Difference between Program header and Section Header in ELF 【发布时间】: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 程序 标题本身。

这有点令人困惑。

【问题讨论】:

部分与部分:***.com/questions/14361248/… 【参考方案1】:

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

[初始] 程序头定义了在 execve(2) 时间投射到 virtual memory(可执行文件的观点)的段(在运行该 ELF 可执行文件的 process 的 address 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

以上是关于ELF中程序头和节头的区别的主要内容,如果未能解决你的问题,请参考以下文章

ELF格式解读- elf头部与节头

南京大学计算机基础 ELF和可执行文件格式

ELF格式解读-程序头与内存布局

ELF格式解读-程序头与内存布局

详述 从代码如何到可执行文件 的过程和解耦

详述 从代码如何到可执行文件 的过程和解耦