25

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

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

我相信 pheaders 仅指向部分。

Q2。文件头和程序头有什么区别?

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

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

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

这有点令人困惑。

4

1 回答 1

27

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

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

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

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

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

于 2014-04-30T04:50:27.943 回答