ELF 提供了一个目标文件框架,用于支持多个处理器、多种数据编码和多类计算机。要支持此目标文件系列,文件的初始字节应指定解释文件的方式。这些字节与发出查询的处理器以及文件的其余内容无关。
ELF 头和目标文件的初始字节对应于 e_ident 成员。
表 7–3 ELF 标识索引
名称 |
值 |
目的 |
---|---|---|
EI_MAG0 |
0 |
文件标识 |
EI_MAG1 |
1 |
文件标识 |
EI_MAG2 |
2 |
文件标识 |
EI_MAG3 |
3 |
文件标识 |
EI_CLASS |
4 |
文件类 |
EI_DATA |
5 |
数据编码 |
EI_VERSION |
6 |
文件版本 |
EI_OSABI |
7 |
操作系统/ABI 标识 |
EI_ABIVERSION |
8 |
ABI 版本 |
EI_PAD |
9 |
填充字节的开头 |
EI_NIDENT |
16 |
e_ident[] 的大小 |
这些索引可访问值为以下各项的字节。
4 字节魔数,用于将文件标识为 ELF 目标文件,如下表中所列。
名称 |
值 |
位置 |
---|---|---|
ELFMAG0 |
0x7f |
e_ident[EI_MAG0] |
ELFMAG1 |
'E' |
e_ident[EI_MAG1] |
ELFMAG2 |
'L' |
e_ident[EI_MAG2] |
ELFMAG3 |
'F' |
e_ident[EI_MAG3] |
字节 e_ident[EI_CLASS] 用于标识文件的类或容量,如下表中所列。
名称 |
值 |
含义 |
---|---|---|
ELFCLASSNONE |
0 |
无效类 |
ELFCLASS32 |
1 |
32 位目标文件 |
ELFCLASS64 |
2 |
64 位目标文件 |
文件格式设计用于在各种大小的计算机之间进行移植,而不会将最大计算机的大小强加给最小的计算机。文件类可定义目标文件容器的数据结构所使用的基本类型。包含在目标文件各节中的数据可以遵循其他编程模型。
类 ELFCLASS32 支持文件和虚拟地址空间最高为 4 GB 的计算机。该类使用表 7–1 中定义的基本类型。
类 ELFCLASS64 保留用于 64 位体系结构,如 64 位 SPARC 和 x64。该类使用表 7–2 中定义的基本类型。
字节 e_ident[EI_DATA] 用于指定目标文件中特定于处理器的数据的数据编码,如下表中所列。
名称 |
值 |
含义 |
---|---|---|
ELFDATANONE |
0 |
无效数据编码 |
ELFDATA2LSB |
1 |
请参见图 7–2。 |
ELFDATA2MSB |
2 |
请参见图 7–3。 |
数据编码一节中提供了有关这些编码的更多信息。其他值保留供将来使用。
字节 e_ident[EI_VERSION] 用于指定 ELF 头版本号。当前,该值必须为 EV_CURRENT。
字节 e_ident[EI_OSABI] 用于标识操作系统以及目标文件所面向的 ABI。其他 ELF 结构中的一些字段包含的标志和值具有特定于操作系统或 ABI 的含义。这些字段的解释由此字节的值确定。
字节 e_ident[EI_ABIVERSION] 用于标识目标文件所面向的 ABI 的版本。此字段用于区分 ABI 的各个不兼容版本。此版本号的解释依赖于 EI_OSABI 字段标识的 ABI。如果没有为对应于处理器的 EI_OSABI 字段指定值,或者没有为 EI_OSABI 字节的特定值所确定的 ABI 指定版本值,则会使用值零来表示未指定的值。
该值用于标记 e_ident 中未使用字节的起始位置。这些字节会保留并设置为零。读取目标文件的程序应忽略这些值。