没有合适的资源?快使用搜索试试~ 我知道了~
首页深入解析:ELF文件格式及其装载与动态连接详解
深入解析:ELF文件格式及其装载与动态连接详解
需积分: 45 26 下载量 125 浏览量
更新于2024-07-17
2
收藏 504KB PDF 举报
本文档深入解析了ELF(Executable and Linking Format,可执行与链接格式)文件格式,它是UNIX系统实验室为应用程序二进制接口开发的一种标准格式,旨在实现跨平台的可执行文件和动态链接。ELF文件格式支持多种操作系统和处理器架构,使其在软件开发和移植中发挥着关键作用。 第1章详细介绍了ELF文件的静态结构,包括文件头部分,它包含了文件类型、机器类型、数据编码等基本信息;节(Sections)是文件的逻辑划分,如代码节、数据节等,用于存放程序的不同组成部分;特殊节则可能包含如符号表、重定位信息等附加数据;字符串表和符号表用于存储变量名、函数名等名称;重定位描述了如何在内存中正确定位节的内容。 第2章重点阐述了文件的装载与动态连接过程。程序头定义了每个节在内存中的位置和权限,段内容则是实际的程序或数据内容。注释段用于提供额外的元数据。动态连接涉及程序解析器处理动态链接库和函数的查找,动态段存放运行时所需的信息;共享目标的依赖关系通过全局偏移量表管理,函数地址和连接表则确保函数调用的准确性;解析符号和哈希表则用于查找和绑定符号。 在第3章,作者通过一个C程序示例进一步说明了ELF文件的构成,包括文件头、节头表、字符串表、代码节、符号表以及不同类型的段,如代码、数据和动态信息。附录提供了源文件和输出文件清单,供读者参考。 该文档自2010年开始翻译和修订,经过多次迭代和完善,最终形成了一个全面、易懂的ELF文件格式指南,适合系统开发者、逆向工程师以及需要理解底层文件结构的专业人士阅读和学习。无论是对于编写可执行程序,还是进行反汇编分析,掌握ELF格式都是至关重要的。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/10969986/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/10969986/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/10969986/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/10969986/bg13.jpg)
ELF 格式解析
e_phnum
此字段表明程序头表中总共有多少个表项。如果一个目标文件中没有程序头
表,该值应设为 0。
e_shentsize
此字段表明在节头表中每一个表项的大小,以字节为单位。
e_shnum
此字段表明节头表中总共有多少个表项。如果一个目标文件中没有节头表,
该值应设为 0。
e_shstrndx
节头表中与节名字表相对应的表项的索引。如果文件没有节名字表,此值应
设置为 SHN_UNDEF。
19
![](https://csdnimg.cn/release/download_crawler_static/10969986/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页未读,继续阅读
![](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/5f2820760fa349188a1c1e6ffe9cd1f6_weixin_44679808.jpg!1)
weixin_44679808
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- Vue实现iOS原生Picker组件:详细解析与实现思路
- Arduino蓝牙小车:参数调试与功能控制
- 百度Java面试精华:200页精选资源涵盖核心知识点
- Swift使用CoreData填坑指南:CoreData在Swift 3.0的变化
- 微距离无线充电器创新设计及其实验探索
- MTK Android平台开发全攻略:44步详解流程
- RecyclerView全面解析:替代ListView的新选择
- Android开发:自动适配中英文键盘解决方案
- Android调用WebService接口教程
- Android开发:BitmapUtil图片处理全解析与实例
- Android多线程断点续传实现详解
- PCA算法在人脸识别会议签到系统中的应用
- EventBus 3.0:Android事件总线详解与实战应用
- Android FileUtil:全面解析文件操作实用技巧与实例
- RecyclerView添加头部和尾部实战教程
- Android实现微博滑动固定顶部栏实战与优化
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](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)