没有合适的资源?快使用搜索试试~ 我知道了~
首页ELF中文手册——ELF中文手册
ELF中文手册——ELF中文手册
需积分: 49 727 浏览量
更新于2023-05-24
评论 1
收藏 528KB DOC 举报
ELF中文手册: 可执行连接格式(Executable and Linking Format)最初是作为应用程序二进制接口(Application Binary Interface(ABI)的一部分被UNIX系统实验室(USL)开发和发布。工具接口标准委员会(TIS)将还在发展的ELF标准选作为一种可移植的目标文件格式,可以在32位Intel体系结构上的很多操作系统中使用。 ELF标准的目的是为软件开发人员提供一组二进制接口定义,这些接口可以延伸到多种操作环境,从而减少重新编码、重新编译程序的需要。接口的内容包括目标模块格式、可执行文件格式以及调试记录信息与格式等。
资源详情
资源评论
资源推荐

Executable and Linking Format
(ELF)
Specification(中文)
2012-2-2
1

1 序 言.................................................................................................................................................3
2 目标文件(Object file)......................................................................................................................3
2.1 简介.......................................................................................................................................3
2.1.1 目标文件格式............................................................................................................3
2.1.2 数据表示....................................................................................................................4
2.2 ELF Header...........................................................................................................................5
2.2.1 ELF Identification......................................................................................................6
2.2.2 机器信息....................................................................................................................8
2.3 Sections.................................................................................................................................8
2.3.1 Section Header...........................................................................................................9
2.3.1.1 Section 类型—sh_type 字段........................................................................10
2.3.1.2 sh_flags 字段................................................................................................13
2.3.1.3 sh_link 和 sh_info 字段................................................................................13
2.3.2 特殊 Sections...........................................................................................................13
2.4 String Table.........................................................................................................................16
2.5 Symbol Table.......................................................................................................................17
2.5.1 st_info 说明..............................................................................................................17
2.5.2 符号类型..................................................................................................................18
2.5.3 特殊的 Section 索引................................................................................................19
2.5.4 Symbol Values..........................................................................................................19
2.6 Relocation............................................................................................................................19
2.6.1 重定位表项..............................................................................................................20
2.6.2 重定位类型..............................................................................................................21
3 程序装载和动态链接....................................................................................................................22
3.1 简介.....................................................................................................................................22
3.2 Program Header..................................................................................................................23
3.2.1 段权限......................................................................................................................24
3.2.2 段类型......................................................................................................................24
3.2.3 基地址......................................................................................................................25
3.2.4 Note Section(注解部分).....................................................................................25
3.3 程序装载.............................................................................................................................27
3.4 动态链接.............................................................................................................................29
3.4.1 程序解释器..............................................................................................................29
3.4.2 动态链接器..............................................................................................................29
3.4.3 动态 section..............................................................................................................30
3.4.4 共享目标的依赖关系..............................................................................................32
3.5 全局偏移量表(GOT)....................................................................................................33
3.6 过程连接表(PLT)..........................................................................................................34
3.7 哈希表.................................................................................................................................36
3.8 初始化和终止函数.............................................................................................................37
4 C Library........................................................................................................................................37
4.1 关于 C 库函数.....................................................................................................................37
4.2 全局数据符号.....................................................................................................................39
2

1 序 言
可 执 行 连 接 格 式 (Executable and Linking Format) 最 初 是 作 为 应 用 程 序 二 进 制 接 口
(Application Binary Interface(ABI)的一部分被 UNIX 系统实验室(USL)开发和发布。工具接
口标准委员会(TIS)将还在发展的 ELF 标准选作为一种可移植的目标文件格式,可以在 32
位 Intel 体系结构上的很多操作系统中使用。
ELF 标准的目的是为软件开发人员提供一组二进制接口定义,这些接口可以延伸到多
种操作环境,从而减少重新编码、重新编译程序的需要。接口的内容包括目标模块格式、
可执行文件格式以及调试记录信息与格式等。
这篇文档是为那些想在不同操作系统上创建目标文件或者可执行文件的开发者准备的。
文档分以下三个部分:
* 第一部分, “目标文件(Object Files)”,描述了 ELF 目标文件格式的三种主要类型。
* 第二部分, “程序装载和动态连接(Program Loading and Dynamic Linking)”,描述了目标文
件的相关信息和系统在创建运行时程序的行为。
* 第三部分, “C 语言库(C Library)”,列出了所有包含在 libsys 中的符号,标准 ANSI C 和 libc
的函数(routines,),还有 libc 函数所需的全局数据符号。
注意: 参考的 X86 体系已经被改成了 Intel 体系。
2 目标文件(Object le)
2.1 简介
目标文件主要有 3 种类型:
* 可重定位(relocatable)文件:包含用于与其他目标文件链接来创建可执行文件或者共
享目标文件的代码和数据。
* 可执行(executable)文件:包含一个用来执行的程序;该文件指定 exec(BA_OS)如何
创建程序进程映象。
* 共享目标(Shared Object)文件:包含可在两种上下文中链接的代码和数据。第一种是
链接器,可以把它和其它的可重定位和共享目标文件一起进行处理,来生成另一目标文件
(是静态的,相当于 windows 的 lib)。第二种是动态链接器,可以把它和一个可执行文件和
其他共享目标文件结合(combine)起来,创建一个进程映象(是动态的,相当于 windows 的
dll)。
用汇编器和链接器创建出来的目标文件,都是以程序的二进制格式来存放的,以便能在
在处理器上直接运行。那些需要其他抽象机器的程序除外,比如象 shell 脚本。
在介绍性的材料过后,第一部分主要描述文件的格式和它怎样适于建立程序。第二部
分描述了目标文件的几个组成部分,重点介绍执行一个程序所必须的信息。
2.1.1 目标文件格式
目标文件既要参与程序链接又要参与程序执行。出于方便性和效率考虑,目标文件格
式提供了两种并行视图,分别反映了这些活动(linking 和 execution)的不同需求。例 1-1 图
3

显示了一个目标文件的组织结构图。
文件开始处是一个 ELF Header,用来描述整个文件的组织。 Sections 包含链接视图的
大 量 信 息 : 包 括 指 令 (instructions) , 数 据 (data,) , 符 号 表 (symbol table) , 重 定 位 信 息
(relocation information)等等。在第一部分中有特殊 Sections 的描述。第二部分讨论 Segments
和目标文件的 Execution View。
程序头部表(Program Header Table),如果存在的话,将告诉系统如何创建一个进程
映像。用来构造进程映象(即执行一个程序)的目标文件必须具有程序头部表,可重定位文
件不需要这个表。
Section 头部表(Section Heade Table)包含了描述文件 Sections 的信息,每个 Section
在表中都有一个表项;每个表项包括:Section 名字,Section 大小等信息。参与链接的目标
文件都必须包含 Section Heade Table;其他目标文件可以有,也可以没有这个表。
注意: 尽管图中显示的各个组成部分是有顺序的,实际上除了 ELF 头部表以外,其他节区
和段都没有规定的顺序。
2.1.2 数据表示
目标文件格式支持 8 位、32 位体系结构。不过它可以扩展到更大或更小的体系上运行。
因此,目标文件采用与机器无关的格式表示一些控制数据,使得可用一种通用的方法来识
别和描述其内容。目标文件中其余的数据使用目标处理器的编码结构,而不管文件是在哪
台机器上创建的。(即:只需要把目标文件中的控制数据表示成机器无关格式就可以广泛移
植了,而文件其余的数据按照目标处理器编码即可)。
目标文件中的所有数据结构都遵从“自然”大小和相关类型的对齐准则。如果需要的话,
数据结构可以包含明确的填充字节,强制使数据结构的大小是 4 的倍数, 以保证 4-byte 对象
是 4 字节对齐的。在文件开头的数据也有适当的对齐。例如,一个包含了一个 Elf32_Addr
成员的数据结构将会在文件中对齐到 4 字节的边界上。
因为移植性的原因,ELF 不使用位字段(bit-fields)。
4

2.2 ELF Header
某些目标文件的控制数据结构可以增长,因为 ELF Header 能够给出他们实际的大小。
如果目标文件格式确实发生改变,可能会发生控制结构比预期的大或者小的情况。在这种
情况下,忽略这些信息是允许的。至于对“缺失”信息的处理方式则要依赖于上下文,如果
定义了扩展的话,将会对这些做出规定。
ELF Header 部分可以用下图中的数据结构表示:
Figure 1-3: ELF Header
#define EI_NIDENT 16
typedef struct {
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type;
Elf32_Half e_machine;
Elf32_Word e_version;
Elf32_Addr e_entry;
Elf32_Off e_phoff;
Elf32_Off e_shoff;
Elf32_Word e_flags;
Elf32_Half e_ehsize;
Elf32_Half e_phentsize;
Elf32_Half e_phnum;
Elf32_Half e_shentsize;
Elf32_Half e_shnum;
Elf32_Half e_shstrndx;
} Elf32_Ehdr;
e_ident:目标文件标识,e_ident[]数组里面提供了机器无关的数据用来解码和解释目标文
件的内容。这些在下面的 ELF Identification 部分有详尽的描述。
e_type:该成员确定目标文件的类型。
Name Value Meaning
======== ===== =======
ET_NONE 0 No file type
ET_REL 1 Relocatable file
ET_EXEC 2 Executable file
ET_DYN 3 Shared object file
ET_CORE 4 Core file(转储格式)
ET_LOPROC 0xff00 Processor-specific(特定处理器文件)
ET_HIPROC 0xffff Processor-specific
虽 然 CORE 的 文 件 内 容 未 被 指 定 , 但 ET_CORE 类 型 是 保 留 用 于 core 文 件 的 。
ET_LOPROC 和 ET_HIPROC(包括 ET_HIPROC)之间的取值是为处理器特定相关的语义保
留的。其他的保留值需要的话将来可用于新的目标文件类型。
e_machine:该成员变量指出了运行该程序需要的体系结构。
Name Value Meaning
======== ===== ========
5
剩余38页未读,继续阅读

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0