1. ELF 文件中的段和节:概念解析与对比
1.1 段与节的基本定义
ELF(Executable and Linkable Format)文件是Unix/Linux系统下可执行文件、目标文件和共享库的标准格式。理解段(Segment)和节(Section)的区别是掌握ELF文件结构的关键。
节是编译器生成的最小组织单元,每个节包含特定类型的数据。常见的节包括:
- .text:存放可执行代码
- .data:存放已初始化的全局变量
- .rodata:存放只读数据
- .bss:存放未初始化的全局变量
段则是操作系统加载程序时的最小映射单元,由链接器将一个或多个属性相同的节合并而成。典型的段类型包括:
- PT_LOAD:可加载段
- PT_DYNAMIC:动态链接信息段
- PT_INTERP:程序解释器路径
1.2 段与节的核心区别
从功能角度看,节服务于链接过程,段服务于加载过程。这种分工体现在它们的结构定义上:
| 特性 | 节(Section) | 段(Segment) |
|---|---|---|
| 创建阶段 | 编译阶段生成 | 链接阶段生成 |
| 使用阶段 | 链接器使用 | 加载器使用 |
| 命名 | 有名称(如.text,.data) | 无名称 |
| 组织结构 | 文件中的原始数据块 | 内存映射的逻辑单元 |
| 典型用途 | 代码/数据分类存储 | 内存权限管理 |
提示:理解这个区别的关键在于认识到编译-链接-加载是三个不同的阶段,每个阶段需要不同的信息组织形式。
1.3 段与节的联系实践
在实际的ELF文件中,一个典型的映射关系可能是:
- 可执行代码段:包含.text节
- 只读
