ELF 文件格式全方位解读:从文件结构到虚拟内存


📖 推荐阅读:《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_COREcore dump 文件core.*

七、反汇编/ELF 分析工具

命令作用
readelf -h/-l/-S/-sELF 头 / 装载表 / 段 / 符号表
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


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值