ELF中程序头和节头的区别

27

Q1 ELF中程序头(Program header)和节头(Section Header)之间有什么区别?

Q1.1 段(segment)和节(section)之间的区别是什么?

我认为pheaders只指向sections。

Q2 文件头(File Header)和程序头(Program Header)之间有什么区别?

根据GNU ld链接器脚本,使用ID:GNU 链接器

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

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

这有点令人困惑。


区段和段在ELF文件格式中有什么区别? - Ciro Santilli OurBigBook.com
2个回答

29

可执行与可链接格式(Executable & Linkable Format)维基页面提供了一张很好的图片,解释了 ELF 和其程序头部、段头部之间的区别。同时请参考elf(5)

初始程序头定义了在运行ELF可执行文件的进程地址空间中投影到虚拟内存(从可执行文件的角度看)中的段。这是在execve(2)时确定的。最终的段头定义了段(链接点的视角,如ld(1)等)。每个段都属于一个段(可能会在执行时被映射到内存中),但不一定可见。ELF文件头指示程序头表和段头表的位置。

请使用objdump(1)readelf(1)来探索您Linux系统上存在的多个ELF文件(可执行文件、共享对象、可链接对象)。
Levine的Linkers & Loaders一书有一章详细解释了这一点。
Drepper的论文How to Write Shared Libraries也有一些很好的解释。

但我的答案仍然适用。请仔细阅读并遵循链接。 - Basile Starynkevitch
亲爱的巴西勒,关于程序头部并没有提供太多信息。我正在寻找有关PHDRS用法的详细信息。{ 名称类型[FILEHDR] [PHDRS] [AT(地址)] [FLAGS(标志)]; } - user435739
2
摘要:运行时间加载时间。未分配的部分(调试信息),不在ELF中但在运行时分配的BSS部分(NOLOAD)。类似的概念/关键字是VMALMA - artless noise

0

问题1:ELF中的程序头和节头有什么区别?

  • 程序头描述了系统需要准备执行程序所需的段或其他信息。
  • 节是一个可以表示很多东西的接口。在这里查看详细信息(搜索Elf64_Shdr
  • 节头位于段内。

问题1.1:段和节之间有什么区别?

  • 一个段由一个或多个节组成,尽管这个事实对程序头来说是透明的。

问题2:文件头和程序头有什么区别?

  • ELF文件头。它出现在每个ELF文件的开头(参见/usr/include/elf.h)。它还具有此文件中存在的程序头数量。
  • ELF文件始终以ELF文件头开始。并引用程序头。您至少需要一个程序头。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接