ELF相比Hex、Bin文件格式有哪些与众不同?

💡 原文中文,约7900字,阅读约需19分钟。
📝

内容提要

ELF文件格式用于存储二进制文件、可执行文件、目标代码、共享库和核心转储文件。ELF文件提供了链接视图和执行视图,以节和段为单位。ELF头部描述整个文件的组织,程序头部表描述文件中的各种segments,节区头部表包含了文件节区的信息。ELF文件中的节区包括.bss、.data、.text等,程序头部表描述与程序执行相关的信息。

🔎

延伸解读

链接视图与执行视图:为何要分节与段

ELF 同时提供以节为单位的链接视图和以段为单位的执行视图。链接时关注节,可忽略程序头部表;运行时关注段,可忽略节区头部表。这种分离让链接器灵活处理节,而加载器按段映射内存。文章指出,系统将相同权限的节合并为段,并以页为单位管理内存,从而减少内部碎片、提高利用率。这也解释了为何一些加固手段会删除节区头部表。

从 ELF 头部字段看文件类型差异

ELF 头部中的 e_type 标识文件类型,e_entry 给出程序入口虚拟地址。文章对比三类文件发现:可重定位文件(.o)不需要执行,因此 e_entry 为 0,且没有程序头部表等执行视图;不同类型的 ELF 文件节区也有较大区别,例如只有可重定位文件有 .strtab 节。这说明文件类型直接影响了头部字段和节区组成,阅读头部信息可快速判断文件用途。

节区头部表与程序头部表的分工

节区头部表决定 ELF 中有哪些具体节区,每个条目描述节区名称、类型、大小、文件偏移等属性;程序头部表则描述与执行直接相关的段信息,用于定位各段的映像并创建进程映像。文章强调,程序头部仅对可执行文件和共享目标文件有意义。两者分工明确:前者服务于链接,后者服务于加载执行。理解这一点有助于分析文件结构或进行二进制处理。

❓

Q&A

ELF文件格式主要用来存储哪些类型的文件?

ELF文件格式用于存储二进制文件、可执行文件、目标代码、共享库和核心转储文件。

ELF文件中的链接视图和执行视图有什么区别?

链接视图以节(section)为单位,用于链接阶段;执行视图以段(segment)为单位,用于执行阶段。链接视图关注节区信息,执行视图关注段信息,一个段通常包含多个节。

为什么ELF文件需要区分链接视图和执行视图?

因为操作系统以页为单位管理内存,将多个具有相同权限的节合并为一个段,可以减少内存页内碎片,节省空间,提高内存利用率。

ELF文件中的程序头部表(Program Header Table)有什么作用?

程序头部表描述文件中的各种段(segments),告诉系统如何创建进程映像,包含段在文件中的偏移、虚拟地址、大小、标志和对齐等信息。

ELF文件中的节区头部表(Section Header Table)包含哪些信息?

节区头部表包含描述文件节区的信息,如节区名称、类型、大小、在文件中的偏移、地址、链接信息、对齐约束等,每个节区对应一个条目。

ELF文件中的.bss、.data、.text节区分别有什么用途?

.bss节区包含未初始化的数据,不占用文件空间,程序执行时系统将其初始化为0;.data节区包含已初始化的数据,将出现在内存映像中;.text节区包含程序的可执行指令。

🏷️

标签

➡️

继续阅读