ELF文件格式中比较重要的有:ELF Header、Program Header Table、Section Table、Section Header Table。最重要的概念:section segment。

ELF文件格式简介

ELF文件格式首先是:(摘录)

  • ELF Header在文件开头,充当了“路线图”来描述文件结构
  • program header table,如果是一个可执行的文件(包括共享目标文件,共享目标文件也可以执行,它是加载进其他EXEC文件中执行),程序头表就紧跟elf header后,这里包含的信息是系统创建进程内存映像所需要的信息
  • section包含了代码、数据、符号、字符串等各种各样必不可少的信息
  • section header table,用于描述section的表,每个section都在这里占一个表项,一般section header table是位于section后边的。如果文件用来链接的话,section header table必须存在。

Cente
Cente

ELF-Walkthrough是一个最简单ELF文件每个字段的解析:(经典)

ELF-Walkthrough
ELF-Walkthrough

什么是section?什么是segment?两者关系如何?

Section是描述ELF文件的,对于链接有用。
Segment是描述程序运行时的VMA(虚拟内存区域)的,对于装载有用。
在装载时,OS根据section的属性(在Section Header Table的flag属性中)映射到VMA中,由于OS只关心section的权限,因此具有相同权限的被映射到相同的segment中,这样可以减少的映射空间。因此,多个section可能被映射到同一个segment中。

通过readelf -l 查看Program Header Table和Segment信息:

image-20190219165451224
image-20190219165451224

参考资料

  • 《程序员的自我修养》 page 68 (关于ELF文件结构每个字段更加细节的描述)