📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry
ELF 文件格式全方位解读:从文件结构到虚拟内存
ELF (全端名称: Executable and Linkable Format),是 Linux 和多数 Unix 系统中普遍使用的一种业界标准二进制文件格式,应用于:
- 可执行文件
- 目标文件
- 加载的助动库
- 核心 dump 文件 (core dump)

一、什么是 ELF 文件?
简单理解:
ELF 是一种给 操作系统和链接器 看的文件格式,指定了如何把代码、数据、符号代码装载进虚拟内存中并进行执行。
二、ELF 文件结构规格
ELF 文件通常由三大部分组成:
1. ELF Header
第一个部分,描述这是一份 ELF 文件,重要元数包括:
- 文件类型(可执行/ 动态库/ 目标文件)
- 系统方向(大编程/小编程)
- 相关表的偏移值、个数、大小
2. Program Header Table
这是给操作系统看的:
- 指明那些部分需要装载到虚拟内存
- 装载时是否可执行,是否可写
3. Section Header Table
这是给链接器看的:
- 描述 .text、.data、.bss、.symtab 等段
- 用于编译/调试/链接
三、常见 Section 段解释
| 段名 | 用途 |
|---|---|
| .text | 代码段(可执行机器代码) |
| .data | 初始化的全局变量 |
| .bss | 未初始化的全局变量 |
| .rodata | 只读字符串并存储到段 |
| .symtab/.strtab | 符号表/字符表 |
| .rel/.rela | 重定位信息 |
四、分析实例: readelf 解析
假设你有一个 ELF 文件 hello,输入:
readelf -h hello
输出中包括:
- ELF 类型: EXEC (Executable file)
- 系统: ARM 或 x86
- 入口地址: 0x08048400
readelf -l hello
显示装载段:
LOAD 0x000000 0x08048000 ... R E
LOAD 0x001000 0x08049000 ... RW
即:
- 代码 .text 装载到 0x08048000
- 数据 .data 装载到 0x08049000
这些地址就是用户端虚拟内存地址!
五、ELF 文件与虚拟内存关系
当你运行一个 ELF 程序时,Linux 核心会根据 Program Header 将文件的部分内容 mmap 到该进程的虚拟内存地址端:
例如:
08048000-08049000 r-xp ... /home/user/hello
08049000-08049800 rw-p ... /home/user/hello
和 readelf -l 输出完全对应,这是实际虚拟内存分配的结果。
因此:
ELF Program Header = 虚拟内存应用地址布局的 blueprint
六、异同 ELF 文件类型
| 类型 | 定义 | 例子 |
|---|---|---|
ET_REL | 目标文件 | main.o |
ET_EXEC | 静态链接可执行文件 | hello |
ET_DYN | 动态库 / PIE 文件 | libc.so / PIE |
ET_CORE | core dump 文件 | core.* |
七、反汇编/ELF 分析工具
| 命令 | 作用 |
|---|---|
readelf -h/-l/-S/-s | ELF 头 / 装载表 / 段 / 符号表 |
objdump -d | 透视机器码反汇编 |
nm | 列出符号名称 |
file | 分析类型:ELF or not |
八、实战示例: objdump -d hello
查看 ELF 文件中 .text 段反汇编代码:
objdump -d hello
输出:
08048400 <main>:
8048400: 55 push %ebp
8048401: 89 e5 mov %esp,%ebp
8048403: ...
这里的地址 0x8048400 就是 ELF 装载到虚拟内存中的地址,和 ELF Header/Program Header 完全一致。
九、总结
- ELF 是 Linux 中编译链上所有二进制文件的基础
- Program Header 是运行时内存布局的根据
- Section Header 是编译/链接/调试使用
- ELF 可以装载到用户端虚拟内存
想要熟悉内核、开发 toolchain,就必须懂 ELF 格式,它是个超级基础矩阵。
📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry
461

被折叠的 条评论
为什么被折叠?



