没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux下ELF文件详解:静态与动态结构及装载过程
Linux下ELF文件详解:静态与动态结构及装载过程
需积分: 45 3 下载量 118 浏览量
更新于2024-07-25
收藏 629KB PDF 举报
本文档深入解析了Linux下的ELF(Executable and Linking Format,可执行与链接格式)文件格式,主要依据ELF规范v1.2版本进行讲解。作者赵凤阳首先介绍了ELF文件的静态结构,包括文件头、节、特殊节、字符串表、符号表和重定位等组成部分,这些都是理解可执行文件的关键部分。 在第一部分,作者详细阐述了ELF文件头,它是每个ELF文件的起始位置,包含了机器类型、数据编码、文件类型等关键信息。接着,讨论了文件中的节,它们是可执行文件中逻辑上的划分,如代码节、数据节、符号表等,每个节都有其特定的功能和用途。 第二章进一步探讨了ELF文件的装载与动态连接机制。程序头用于存储程序的加载信息,包括基地址、段权限等,段内容则包含了实际的指令和数据。动态连接部分介绍了程序解析器和动态连接器的作用,以及如何处理共享目标的依赖关系,通过全局偏移量表和函数地址来确保正确链接。此外,还涉及到了哈希表和初始化/终止函数等概念。 第三章提供了示例程序的解析,通过具体实例展示ELF文件头、节头表、节内容、符号表和段的结构,帮助读者更好地理解整个流程。附录部分列出了源文件和输出文件清单,便于读者复现和学习。 本文档是一份详尽的ELF格式指南,适合系统开发者、程序员以及对操作系统底层工作原理感兴趣的读者,它不仅解释了ELF格式的理论知识,还通过实例演示了其实用价值。随着文档的多次修订,作者不断补充和完善内容,确保了信息的准确性和实用性。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/5964163/bg10.jpg)
ELF 格式解析
EI_PAD
从 e_ident[EI_PAD]到 e_ident[EI_NIDENT-1]之间的 9 个字节目前暂时不使
用,留作以后扩展,在实际的文件中应被填 0 补充,其它程序在读取 ELF 文
件头时应该忽略这些字节。如果以后 ELF 文件头的内容被扩展,这 9 个字节
中有一些被使用起来的话,EI_PAD 将被定义得更大。
e_type
此字段表明本目标文件属于哪种类型
名字 值 意义
ET_NONE 0
未知文件类型
ET_REL 1
可重定位文件
ET_EXEC 2
可执行文件
ET_DYN 3
动态链接库文件
ET_CORE 4
Core 文件
ET_LOPROC 0xff00
特定处理器文件扩展下边界
ET_HIPROC 0xffff
特定处理器文件扩展上边界
在上述文件类型中,core 文件类型目前还不支持,但仍然为它保留了这一关
键字。
ET_LOPROC ~ ET_HIPROC (0xff00 ~ 0xffff)这一范围内的文件类型是为特定
处理器而保留的,如果需要为某种处理器专门设定文件格式,可以从这一范围内选
取一个做为标识。
在以上已定义范围外的文件类型均为保留类型,留做以后可能的扩展。
e_machine
此字段用于指定该文件适用的处理器体系结构。
名字 值 意义
EM_NONE 0
未知体系结构
EM_M32 1 AT&T WE 32100
16
![](https://csdnimg.cn/release/download_crawler_static/5964163/bg11.jpg)
ELF 格式解析
EM_SPARC 2 SPARC
EM_386 3 Intel Architecture
EM_68K 4 Motorola 68000
EM_88K 5 Motorola 88000
EM_860 7 Intel 80860
EM_MIPS 8 MIPS RS3000 Big-Endian
EM_MIPS_RS4-BE 10 MIPS RS4000 Big-Endian
RESERVED 11 ~ 16
保留未用
对于 Intel 架构处理器,e_machine 成员取值固定为 EM_386。
在以上已定义范围外的处理器类型均为保留的,在需要的时候将分配给新出
现的处理器使用。这里所定义的这些处理器类型名字都以 ET_为前缀,后接处理器
名。这些处理器名在下文中可能会再次被用到,在下文中会遇到类似的一些定义,
它们可能是一些类型或者一些属性。比如,定义某一个属性,它以 EF_为前缀,以
_WIDGET 结尾,而中间的处理器名部分正是上表中某一项”EM_XYZ”的后
缀”XYZ”,那么,这个属性就写做”EF_XYZ_WIDGET”。
在 ELF 文件中,处理器厂商可以定义一些自有的常量,这类常量的命名必须
要遵守一定的规则,只要合乎这一规则,这些名字就都是合法的,ELF 文件解析器
就需要能够识别他们。这种规则一般是以某种前缀(比如 DT_或 PT_)开头,加上
处理器的名字(比如 M32),再加上_SPECIAL 后缀构成,比如
DT_M32_SPECIAL。
由于历史的原因,规范早期所定义的一些常量名字与这种命名约定相混淆,
这种特殊的名字也要能够支持。但到目前为止,这类情况只有一种,即
DT_JMP_REL。
在 ELF 文件中,处理器厂商还可以定义一些自有的段名字。其命名规则是在
原来的段名字之前再加上一个处理器架构的缩写。这个名字应该与 ELF 文件头中
的 e_machine 字段相配套。比如,.FOO.psect 这个名字就是为 FOO 架构定义的
psect 节。下列已存在的名字与这一规则有混淆,需要被特别支持。
.sdata .lit4 .gptab
.tdesc .lit8 .liblist
17
![](https://csdnimg.cn/release/download_crawler_static/5964163/bg12.jpg)
ELF 格式解析
.sbss .reginfo .conflict
e_version
此字段指明目标文件的版本。
名字 值 意义
EV_NONE 0
非法版本号
EV_CURRENT 1
当前版本号
EV_CURRENT 是一个动态的数字,表示最新的版本。尽管当前最新的版本号
就是“1”,但如果以后有更新的版本的话,EV_CURRENT 将被更新为更大的数
字,而目前的“1”将成为历史版本。
e_entry
此字段指明程序入口的虚拟地址。即当文件被加载到进程空间里后,入口程
序在进程地址空间里的地址。对于可执行程序文件来说,当 ELF 文件完成加载之
后,程序将从这里开始运行;而对于其它文件来说,这个值应该是 0。
e_phoff
此字段指明程序头表(program header table)开始处在文件中的偏移量。如果没
有程序头表,该值应设为 0。
e_shoff
此字段指明节头表(section header table)开始处在文件中的偏移量。如果没有节
头表,该值应设为 0。
e_flags
此字段含有处理器特定的标志位。标志的名字符合”EF_machine_flag”的格
式。对于 Intel 架构的处理器来说,它没有定义任何标志位,所以 e_flags 应该为
0。
e_ehsize
此字段表明 ELF 文件头的大小,以字节为单位。
e_phentsize
此字段表明在程序头表中每一个表项的大小,以字节为单位。
18
![](https://csdnimg.cn/release/download_crawler_static/5964163/bg13.jpg)
ELF 格式解析
e_phnum
此字段表明程序头表中总共有多少个表项。如果一个目标文件中没有程序头
表,该值应设为 0。
e_shentsize
此字段表明在节头表中每一个表项的大小,以字节为单位。
e_shnum
此字段表明节头表中总共有多少个表项。如果一个目标文件中没有节头表,
该值应设为 0。
e_shstrndx
节头表中与节名字表相对应的表项的索引。如果文件没有节名字表,此值应
设置为 SHN_UNDEF。
19
![](https://csdnimg.cn/release/download_crawler_static/5964163/bg14.jpg)
ELF 格式解析
1.4 节
在目标文件中可以包含很多“节”(section),所有这些“节”都登记在一张称为
“节头表”(section header table)的数组里。节头表的每一个表项是一个 Elf32_Shdr
结构,通过每一个表项可以定位到对应的节。
在解释 ELF 文件头的时候提到过,在文件头中有一个 e_shoff 成员给出节头表
在 ELF 文件中的位置,即相对于文件开始处的偏移量;e_shnum 成员指明节头表
中包含多少个表项;e_shentsize 成员指明了每一个表项的大小。
某些表项的索引值被保留,有特殊的含义。ELF 文件的节头表中不会出现索引
值为以下各值的表项:
图 1-7 特殊节索引值
名字 值
SHN_UNDEF 0
SHN_LORESERVE 0xff00
SHN_LOPROC 0xff00
SHN_HIPROC 0xff1f
SHN_ABS 0xfff1
SHN_COMMON 0xfff2
SHN_HIRESERVE 0xffff
SHN_UNDEF
该值被定义为 0,它表示一个未定义的、不存在的节的索引。
尽管索引值 0 是一个未定义的保留值,但在节头表中的索引还是会从 0 开始。
比如,如果文件头中 e_shnum 的值为 6,表明在节头表中存在 6 个表项,其索引值
分别为从 0 到 5。其中 0 号表项的意义将在后面说明。
SHN_LORESERVE
被保留索引号区间的下限。
SHN_LOPROC
为处理器定制节所保留的索引号区间的下限。
20
剩余107页未读,继续阅读
![exe](https://img-home.csdnimg.cn/images/20210720083343.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
chingwhen
- 粉丝: 4
- 资源: 5
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- AirKiss技术详解:无线传递信息与智能家居连接
- Hibernate主键生成策略详解
- 操作系统实验:位示图法管理磁盘空闲空间
- JSON详解:数据交换的主流格式
- Win7安装Ubuntu双系统详细指南
- FPGA内部结构与工作原理探索
- 信用评分模型解析:WOE、IV与ROC
- 使用LVS+Keepalived构建高可用负载均衡集群
- 微信小程序驱动餐饮与服装业创新转型:便捷管理与低成本优势
- 机器学习入门指南:从基础到进阶
- 解决Win7 IIS配置错误500.22与0x80070032
- SQL-DFS:优化HDFS小文件存储的解决方案
- Hadoop、Hbase、Spark环境部署与主机配置详解
- Kisso:加密会话Cookie实现的单点登录SSO
- OpenCV读取与拼接多幅图像教程
- QT实战:轻松生成与解析JSON数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)