elf文件格式(中文版)
- 格式:doc
- 大小:140.00 KB
- 文档页数:55
第1章文件格式1.1 Executable and Linking Format (ELF)1.1.1整体结构ELF对象格式用于目标文件(.o扩展名)和执行文件. 有些信息只出现在目标文件或执行文件中.ELF文件由下列部件构成. ELF header必须放在文件的开始;其他部件可以随便排放(ELF header给出了其他部件的偏移量).1.1.2ELF头[ELF Header]ELF头包含目标文件的一般信息;具有如下结构(from elf.h):#define EI_NIDENT 16typedef struct {unsigned char e_ident[EI_NIDENT];Elf32_Half e_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;};ELF头域描述:1.1.3程序头[Program Header]程序头为一结构数组,每个元素描述执行文件的一个可载入段.元素结构如下(from elf.h):typedef struct {Elf32_Word p_type;Elf32_Off p_offset;Elf32_Addr p_vaddr;Elf32_Addr p_paddr;Elf32_Word p_filesz;Elf32_Word p_memsz;Elf32_Word p_flags;Elf32_Word p_align;} Elf32_Phdr;1.1.4Section HeadersELF文件中的每个section的都有激励[incitation]头; Section个数由ELF Header中的e_shnum域指明. Section headers结构如下(from elf.h):typedef struct {Elf32_Word sh_name;Elf32_Word sh_type;Elf32_Word sh_flags;Elf32_Addr sh_addr;Elf32_Off sh_offset;Elf32_Word sh_size;Elf32_Word sh_link;Elf32_Word sh_info;Elf32_Word sh_addralign;Elf32_Word sh_entsize;} Elf32_Shdr;1.1.5Special Sections1.1.6重定位信息[Relocation Information]重定位信息section包含关于非确定引用[unresolved references]的信息.因为编译器[compilers]和汇编器[assemblers]不知道符号将分配的绝对内存地址,和别的文件的符号定义;所以对符号的每个引用都将创建一个重定位条目. 该条目指向地址(where the reference is being made), 和指向包含被引用符号的符号表. 连接器[linker]给所有符号分配地址之后, 将使用重定位信息添入正确的地址. 执行文件没有重定位section.例如: 汇编表示符号加上偏移:move.l var+16,d0偏移量存储在r_addend域,这样,符号真实地址加上该地址域将产生一个正确的引用.重定位条目有如下结构(from elf.h):typedef struct {Elf32_Addr r_offset;Elf32_Word r_info;Elf32_Sword r_addend;} Elf32_Rel;1.1.7符号表符号表section .symtab为一数组,数组元素包含关于被ELF文件引用的符号的信息.符号表条目有如下结构(from elf.h):typedef struct {ELF32_Word st_name;ELF32_Addr st_value;ELF32_Word st_size;unsigned char st_info;unsigned char st_other;Elf32_Half sth_shndx;} Elf32_Sym;1.1.8串表串表sections( .strtab和.shstrtab)包含符号表中符号名和section名.名都以null结束. 这些符号通过偏移指向[point into]串表. 串表的第一字节总是零, 其后所有串顺序存放.。
可执行文件(ELF)格式的理解ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西、以及都以什么样的格式去放这些东西。
它自最早在System V 系统上出现后,被xNIX 世界所广泛接受,作为缺省的二进制文件格式来使用。
可以说,ELF是构成众多xNIX系统的基础之一,所以作为嵌入式Linux系统乃至内核驱动程序开发人员,你最好熟悉并掌握它。
其实,关于ELF这个主题,网络上已经有相当多的文章存在,但是其介绍的内容比较分散,使得初学者不太容易从中得到一个系统性的认识。
为了帮助大家学习,我这里打算写一系列连贯的文章来介绍ELF以及相关的应用。
这是这个系列中的第一篇文章,主要是通过不同工具的使用来熟悉ELF文件的内部结构以及相关的基本概念。
后面的文章,我们会介绍很多高级的概念和应用,比方动态链接和加载,动态库的开发,C语言Main函数是被谁以及如何被调用的,ELF格式在内核中的支持,Linux内核中对ELF section的扩展使用等等。
好的,开始我们的第一篇文章。
在详细进入正题之前,先给大家介绍一点ELF文件格式的参考资料。
在ELF 格式出来之后,TISC(Tool Interface Standard Committee)委员会定义了一套ELF标准。
你可以从这里(/elf/)找到详细的标准文档。
TISC委员会前后出了两个版本,v1.1和v1.2。
两个版本内容上差不多,但就可读性上来讲,我还是推荐你读v1.2的。
因为在v1.2版本中,TISC重新组织原本在v1.1版本中的内容,将它们分成为三个部分(books):a) Book I介绍了通用的适用于所有32位架构处理器的ELF相关内容b) Book II介绍了处理器特定的ELF相关内容,这里是以Intel x86 架构处理器作为例子介绍c) Book III介绍了操作系统特定的ELF相关内容,这里是以运行在x86上面的UNIX System V.4 作为例子介绍值得一说的是,虽然TISC是以x86为例子介绍ELF规范的,但是如果你是想知道非x86下面的ELF实现情况,那也可以在/elf/中找到特定处理器相关的Supplment文档。
序言1. OBJECT文件导言ELF头(ELF Header)SectionsString表(String Table)Symbol表(Symbol Table)重定位(Relocation)2. 程序装载与动态连接导言Program头(Program Header)Program装载(Program Loading)Dynamic连接(Dynamic Linking)3. C LIBRARYC Library________________________________________________________________导言________________________________________________________________ ELF: 可执行连接格式可执行连接格式是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface(ABI)而开发和发布的。
工具接口标准委员会(TIS)选择了正在发展中的ELF标准作为工作在32位INTEL体系上不同操作系统之间可移植的二进制文件格式。
假定开发者定义了一个二进制接口集合,ELF标准用它来支持流线型的软件发展。
应该减少不同执行接口的数量。
因此可以减少重新编程重新编译的代码。
关于这篇文档这篇文档是为那些想创建目标文件或者在不同的操作系统上执行文件的开发着准备的。
它分以下三个部分:* 第一部分, “目标文件Object Files”描述了ELF目标文件格式三种主要的类型。
* 第二部分, “程序转载和动态连接”描述了目标文件的信息和系统在创建运行时程序的行为。
* 第三部分, “C 语言库”列出了所有包含在libsys中的符号,标准的ANSI C和libc的运行程序,还有libc运行程序所需的全局的数据符号。
注意: 参考的X86体系已经被改成了Intel体系。
________________________________________________________________1. 目标文件(Object file)________________________________________________________________========================= 序言=========================第一部分描述了iABI的object文件的格式, 被称为ELF(Executableand Linking Format). 在object文件中有三种主要的类型。
ELF文件格式在介绍ELF格式之前,先简单说明一下可执行文件的生成流程:1)编写C源文件,或汇编源文件;2)准备共享库格式的目标文件(shared object file),如数学库、标准库;2)用编译器(compiler)将C编译成可重定位格式的目标文件(relocatable object file),用汇编器(assembler)将汇编源文件编译成可重定位格式的目标文件;3)用连接器(linker)将第二步的共享个库文件和第三步生成的目标文件链接生成可执行文件(executable file)。
ELF(excutable and linking format)是一种可执行可链接格式的二进制文件,它可以用来表示relocatable file、executable file或者shared object file,这三者都是目标文件(object file)。
所谓“可执行”指可以被调入内存供CPU直接运行;“可链接”指多个ELF格式的目标文件可以被链接在一起形成一个可执行文件。
下图左边是可链接格式的ELF文件格式,右边是可执行格式的ELF文件格式。
无论是linking view还是execution view的ELF文件,他们都包含一个ELF Header,它包含文件的基本信息。
ELF自定义了一些类型,并强制规定了他们所占的字节个数,以实现跨平台,如Elf32_Half占2字节、Elf32_Word占4字节、Elf32_Off占4字节等。
1typedef struct2{3unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ 4Elf32_Half e_type; /*目标文件类型 */5Elf32_Half e_machine; /*Architecture */6Elf32_Word e_version; /* Object file version */7Elf32_Addr e_entry; /*入口地址 */8Elf32_Off e_phoff; /* Program header table文件偏移 */ 9Elf32_Off e_shoff; /* Section header table 文件偏移 */ 10Elf32_Word e_flags; /* Processor-specific flags */11Elf32_Half e_ehsize; /* ELF header 大小 */12Elf32_Half e_phentsize; /*每个Program header大小 */13Elf32_Half e_phnum; /*一共多少个Program header */14Elf32_Half e_shentsize; /* 每个Section header大小 */15Elf32_Half e_shnum; /*一共多少个 Section header */16Elf32_Half e_shstrndx; /*Section的字符表在section header table的索引值 */17} Elf32_Ehdr;18e_ident[EI_NIDENT]是一个有16个字节的数组,e_ident[0]=0x7f,e_ident[1]=”E”,e_ident[2]=”L”,e_ident[3]=”F”,e_ident[4]指示ELFCLASS(0:ELFCLASSNONE;1:ELFCLASS32;2:ELFCLASS64),e_ident[5]指示程序中的数据格式(0:无效;1:小端;2:大端),e_ident[6]指示版本固定为0x1,e_ident[7]到e_ident[14]固定为0,e_ident[15]固定为16用于指示e_ident[]数组有16个元素。
elf文件1 Executable and Linkable Format(ELF)初稿,图请参考ELF_Format手册1.1 PrefaceELF-可执行链接格式最初是由UNIX系统实验室(USL)作为应用程序二进制接口(ABI)开发和发行。
工具接口标准委员会TIS已经将ELF 作为运行在Intel32位架构之上的各类型操作系统的可导出对象文件格式标准。
ELF标准为开发者提供了一组横跨多运行环境的二进制接口定义来组织软件开发。
1.2 对象文件$leads................1.2.1 介绍本部分描述了iABI对象文件格式,也称之为ELF。
有三种主要类型的对象文件:1. 可重组(relocatable)文件包含了适合用来链接其他对象文件的代码和数据,从而创建出可执行或可共享的对象文件;2. 可执行(executable)文件包含了用于执行的程序,该文件规定了exec如何创建一个程序的进程映像;3. 可共享对象(shared object)文件包含了用来在两个上下文之间链接的代码和数据。
首先,链接器ld将该文件和其他的可重组文件或可共享对象文件进行处理后,创建出新对象文件,其次,动态链接器将该新对象文件与可执行文件或共享对象组合,来共同创建一个进程映像;经过汇编器以及链接器创建成的对象文件,其是在处理器上可直接执行的程序的二进制代表。
本部分主要描述文件格式以及其如何用来构建程序。
后一部分也描述了对象文件,集中在程序执行所必须的信息上。
1.2.1.1 文件格式在程序链接和程序执行过程都涉及到对象文件。
出于方便和效率,对象文件格式图从链接和运行两个视角来展示文件的内容。
ELF header位于文件的开始处,其用来描述文件的组织结构。
Section包含了大量的对象文件信息,从链接的视角来看就是指令、数据、符号表、重组信息等等。
Segment和Program 是从程序执行视角来观看的,这将在下部分讲解。
ELF文件格式•目标文件有三种类型:–可重定位文件(Relocatable File)包含适合于与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据。
–可执行文件(Executable File)包含适合于执行的一个程序,此文件规定了exec()如何创建一个程序的进程映像。
–共享目标文件(Shared Object File)包含可在两种上下文中链接的代码和数据。
首先链接编辑器可以将它和其它可重定位文件和共享目标文件一起处理,生成另外一个目标文件。
其次,动态链接器(Dynamic Linker)可能将它与某个可执行文件以及其它共享目标一起组合,创建进程映像。
•目标文件全部是程序的二进制表示,目的是直接在某种处理器上直接执行。
ELF格式文件目前是UNIX系统非常常见二进制文件格式,ELF文件格式主要3大部分,ELF 文件头,节区表,和节区。
对于可执行文件对应的是段表,段。
下面这3部分简单分布情况,上面这条横条可以看成ELF文件从头到尾。
对于ELF头,节区表,节区都对应分布在文件里面,通过偏移来表示其对应在文件的位置。
2、ELF头对应字段的意义简单用下图来说明,其他字段可以对应解析3、节区相关信息4、对于节区经常使用的两个信息字段sh_info,sh_link对应字段意义5、对于一个ELF目标文件,通常都会有以下几个节区,可以通readelf–S test.oSection Headers:[Nr]Name Type Addr Off Size ES Flg Lk Inf Al [0]NULL0000000000000000000000000[1].text PROGBITS0000000000003400001100AX004[2].data PROGBITS0000000000004800000000WA004[3].bss NOBITS0000000000004800000000WA004[4].comment PROGBITS0000000000004800002a00001[5].note.GNU-stack PROGBITS0000000000007200000000001[6].shstrtab STRTAB0000000000007200004500001[7].symtab SYMTAB0000000000022000008010874[8].strtab STRTAB000000000002a000000a00001符号表:对应于.symtab,它保存着目标文件中所有的符号信息字符串表:.strtab,保存字符窜信息。
________________________________________________________________EXECUTABLE AND LINKABLE FORMAT (ELF)Portable Formats Specification, Version 1.1Tool Interface Standards (TIS)________________________________________________________________=========================== Contents 内容===========================序言1. OBJECT文件导言ELF头(ELF Header)SectionsString表(String Table)Symbol表(Symbol Table)重定位(Relocation)2. 程序装载与动态连接导言Program头(Program Header)Program装载(Program Loading)Dynamic连接(Dynamic Linking)3. C LIBRARYC Library________________________________________________________________导言________________________________________________________________ELF: 可执行连接格式可执行连接格式是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface(ABI)而开发和发布的。
工具接口标准委员会(TIS)选择了正在发展中的ELF标准作为工作在32位INTEL体系上不同操作系统之间可移植的二进制文件格式。
假定开发者定义了一个二进制接口集合,ELF标准用它来支持流线型的软件发展。
ELF文件格式分析ELF(Executable and Linkable Format)是一种常见的可执行文件格式,用于在UNIX和类UNIX系统上存储和执行程序。
在本文中,我们将详细分析ELF文件格式的结构和各个部分的作用。
首先是标识部分,它占据ELF文件的最开始位置,有以下几个字段:1. Magic Number:ELF文件的前四个字节,用于识别文件类型。
对于32位系统,它的值是0x7F、'E'、'L'和'F';对于64位系统,它的值是0x7F、'E'、'L'和'F'以及0x022.类型:指定了ELF文件的类型,比如可执行文件、目标文件、共享库等等。
3.类型机器:指定了目标机器的体系结构,如x86、ARM等等。
4.版本:指定了ELF文件的版本号。
5.入口点:对于可执行文件,指定程序的入口点。
6.程序头表和节头表的偏移地址和大小。
接下来是文件头部分,它描述了ELF文件的整体结构和布局:1.类型:表示ELF文件的类型,如可重定位文件、可执行文件、共享目标文件等。
2.目标机器:标识目标机器的类型。
3.版本:指定了ELF文件的版本号。
4.入口点:指定程序的入口点。
5.程序头表偏移地址和节头表偏移地址。
6.程序头表项的大小、数量和节头表项的大小、数量。
7.字符串表索引,用于找到文件中的字符串。
最后是节头表部分,它包含了所有节(Section)的相关信息,比如代码段、数据段等等。
每个节头表项包含以下字段:1.节的名称:用于标识节的名称。
2.节的类型:描述节的属性,如代码段、数据段、符号表等。
3.节的标志:描述节的属性,如可写、可执行等。
4.节的虚拟地址:指定节在内存中的虚拟地址。
5.节的文件偏移地址:指定节在文件中的偏移地址。
6.节的大小:指定节的大小。
7.链接和信息:用于指定其他与节相关的信息。
通过分析ELF文件的结构,我们可以获得有关程序入口点、机器类型、节的信息等重要的元数据。
elf开头的二进制文件摘要:1.文件格式简介- 什么是elf文件- elf文件的特点和应用场景2.elf文件的组成- elf文件的头部信息- elf文件的主体部分3.elf文件的解析- elf文件的解析流程- elf文件解析的工具和方法4.elf文件的修改与编译- elf文件的修改方法- elf文件的编译流程5.elf文件的应用案例- elf文件在嵌入式系统中的应用- elf文件在软件开发中的实际应用正文:elf开头的二进制文件,通常是指采用ELF(Executable and Linkable Format)格式的可执行文件。
ELF是一种通用的可执行文件格式,广泛应用于各种操作系统和处理器架构。
本文将详细介绍elf文件的基本概念、组成、解析方法以及在实际应用中的相关案例。
ELF文件是一种用于存储程序代码和数据的目标文件格式。
它具有可移植性、高效性和可扩展性等特点,适用于多种不同的处理器架构。
ELF文件主要由三部分组成:ELF头部(ELF Header)、程序头部表(Program Header Table)和节(Section)。
1.ELF头部(ELF Header)ELF头部是ELF文件的第一部分,它包含了关于ELF文件的基本信息,如文件类型、入口地址、程序头部表的位置等。
ELF头部使用ELF64或ELF32数据结构表示,分别对应64位和32位处理器架构。
2.程序头部表(Program Header Table)程序头部表是ELF文件的主体部分之一,它包含了一系列程序头部,每个程序头部描述了一个程序段(如代码段、数据段、符号表等)的信息。
程序头部表的第一个程序头部总是指向ELF文件的主体部分,即程序代码和数据。
3.节(Section)ELF文件的第三部分是节,它包含了实际程序代码和数据。
每个节都有一个唯一的名称,用于描述节的内容和用途。
常见的节类型包括:代码段(.text)、数据段(.data)、符号表(.symtab)等。
Executable and Linking Format(ELF)Specification(中文)2012-2-21 序言 (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 字段 (12)2.3.1.3 sh_link和sh_info字段 (12)2.3.2 特殊Sections (13)2.4 String Table (15)2.5 Symbol Table (16)2.5.1 st_info说明 (17)2.5.2 符号类型 (17)2.5.3 特殊的Section索引 (18)2.5.4 Symbol Values (18)2.6 Relocation (19)2.6.1 重定位表项 (19)2.6.2 重定位类型 (20)3 程序装载和动态链接 (22)3.1 简介 (22)3.2 Program Header (22)3.2.1 段权限 (23)3.2.2 段类型 (23)3.2.3 基地址 (24)3.2.4 Note Section(注解部分) (25)3.3 程序装载 (26)3.4 动态链接 (28)3.4.1 程序解释器 (28)3.4.2 动态链接器 (28)3.4.3 动态section (29)3.4.4 共享目标的依赖关系 (32)3.5 全局偏移量表(GOT) (33)3.6 过程连接表(PLT) (33)3.7 哈希表 (35)3.8 初始化和终止函数 (36)4 C Library (37)4.1 关于C库函数 (37)4.2 全局数据符号 (38)1 序言可执行连接格式(Executable and Linking Format)最初是作为应用程序二进制接口(Application Binary Interface(ABI)的一部分被UNIX系统实验室(USL)开发和发布。
3. 页标题的内容和文章的页脚已经在开始的时候被换掉了。
4. 文章的排版也已经修正过了。
5. 如果必要,不同的字体已经被忽略了。
大部分地方,这片文档能让你充分的理解。
然而,很小的地方,原始的文档使用了斜体字来指出文章中的字符变量。
在那种情况下,本文使用<尖括号>。
在原始的文档中没有出现尖括号。
6. 原始的文档有三个错误,如果你是不经意读它的话,是不会明显就能找出的。
但是在这里,明确的被鉴别出来了。
我很冒昧的纠正了那些错误。
在他们的位置用一个{*}做上了标记。
可能还有其他我没有看出来的的错误。
如果有如何其他的区别都是我的责任。
这样的错误请mailto:breadbox@.Brian Raiter[Last edited Fri Jul 23 1999]________________________________________________________________EXECUTABLE AND LINKABLE FORMAT (ELF)Portable Formats Specification, Version 1.1Tool Interface Standards (TIS)________________________________________________________________=========================== Contents 内容===========================序言1. OBJECT文件导言ELF头(ELF Header)SectionsString表(String Table)Symbol表(Symbol Table)重定位(Relocation)2. 程序装载与动态连接导言Program头(Program Header)Program装载(Program Loading)Dynamic连接(Dynamic Linking)3. C LIBRARYC Library________________________________________________________________导言________________________________________________________________ ELF: 可执行连接格式可执行连接格式是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface(ABI)而开发和发布的。
工具接口标准委员会(TIS)选择了正在发展中的ELF标准作为工作在32位INTEL体系上不同操作系统之间可移植的二进制文件格式。
假定开发者定义了一个二进制接口集合,ELF标准用它来支持流线型的软件发展。
应该减少不同执行接口的数量。
因此可以减少重新编程重新编译的代码。
关于这片文档这篇文档是为那些想创建目标文件或者在不同的操作系统上执行文件的开发着准备的。
它分以下三个部分:* 第一部分, “目标文件Object Files”描述了ELF目标文件格式三种主要的类型。
* 第二部分, “程序转载和动态连接”描述了目标文件的信息和系统在创建运行时程序的行为。
* 第三部分, “C 语言库”列出了所有包含在libsys中的符号,标准的ANSI C和libc的运行程序,还有libc运行程序所需的全局的数据符号。
注意: 参考的X86体系已经被改成了Intel体系。
________________________________________________________________1. 目标文件(Object file)________________________________________________________________========================= 序言=========================第一部分描述了iABI的object文件的格式, 被称为ELF(Executableand Linking Format). 在object文件中有三种主要的类型。
* 一个可重定位(relocatable)文件保存着代码和适当的数据,用来和其他的object文件一起来创建一个可执行文件或者是一个共享文件。
* 一个可执行(executable)文件保存着一个用来执行的程序;该文件指出了exec(BA_OS)如何来创建程序进程映象。
* 一个共享object文件保存着代码和合适的数据,用来被下面的两个链接器链接。
第一个是连接编辑器[请参看ld(SD_CMD)],可以和其他的可重定位和共享object文件来创建其他的object。
第二个是动态链接器,联合一个可执行文件和其他的共享object文件来创建一个进程映象。
一个object文件被汇编器和联接器创建, 想要在处理机上直接运行的object文件都是以二进制来存放的。
那些需要抽象机制的程序,比如象shell脚本,是不被接受的。
在介绍性的材料过后,第一部分主要围绕着文件的格式和关于如何建立程序。
第二部分也描述了object文件的几个组成部分,集中在执行程序所必须的信息上。
文件格式Object文件参与程序的联接(创建一个程序)和程序的执行(运行一个程序)。
object 文件格式提供了一个方便有效的方法并行的视角看待文件的内容,在他们的活动中,反映出不同的需要。
例1-1图显示了一个object文件的组织图。
+ 图1-1: Object文件格式Linking 视角Execution 视角============ ==============ELF header ELF headerProgram header table (optional) Program header tableSection 1 Segment 1... Segment 2Section n ...Section header table Section header table (optional)一个ELF头在文件的开始,保存了路线图(road map),描述了该文件的组织情况。
sections保存着object 文件的信息,从连接角度看:包括指令,数据,符号表,重定位信息等等。
特别sections的描述会出项在以后的第一部分。
第二部分讨论了段和从程序的执行角度看文件。
假如一个程序头表(program header table)存在,那么它告诉系统如何来创建一个进程的内存映象。
被用来建立进程映象(执行一个程序)的文件必须要有一个程序头表(program header table);可重定位文件不需要这个头表。
一个section头表(section header table)包含了描述文件sections的信息。
每个section在这个表中有一个入口;每个入口给出了该section的名字,大小,等等信息。
在联接过程中的文件必须有一个section头表;其他object文件可要可不要这个section头表。
注意: 虽然图显示出程序头表立刻出现在一个ELF头后,section头表跟着其他section部分出现,事实是的文件是可以不同的。
此外,sections和段(segments)没有特别的顺序。
只有ELF头(elf header)是在文件的固定位置。
数据表示object文件格式支持8位、32位不同的处理器。
不过,它试图努力的在更大或更小的体系上运行。
因此,object文件描绘一些控制数据需要用与机器无关的格式,使它尽可能的用一般的方法甄别object文件和描述他们的内容。
在object文件中剩余的数据使用目标处理器的编码方式,不管文件是在哪台机子上创建的。
+ 图1-2: 32-Bit Data TypesName Size Alignment Purpose==== ==== ========= =======Elf32_Addr 4 4 Unsigned program addressElf32_Half 2 2 Unsigned medium integerElf32_Off 4 4 Unsigned file offsetElf32_Sword 4 4 Signed large integerElf32_Word 4 4 Unsigned large integerunsigned char 1 1 Unsigned small integer所有的object文件格式定义的数据结构是自然大小(natural size),为相关的类型调整指针。
如果需要,数据结构中明确的包含了确保4字节对齐的填充字段。
来使结构大小是4的倍数。
数据从文件的开始也有适当的对齐。
例如,一个包含了Elf32_Addr成员的结构将会在文件内对齐到4字节的边界上。
因为移植性的原因,ELF不使用位字段。
========================== ELF Header ==========================一些object文件的控制结构能够增长的,所以ELF头包含了他们目前的大小。
假如object文件格式改变,程序可能会碰到或大或小他们不希望的控制结构。
程序也有可能忽略额外(extra)的信息。
对待来历不明(missing)的信息依靠上下文来解释,假如扩展被定义,它们将会被指定。
+ 图1-3: ELF Header#define EI_NIDENT 16typedef 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这个最初的字段标示了该文件为一个object文件,提供了一个机器无关的数据,解释文件的内容。
在下面的ELF的鉴别(ELF Identification)部分有更详细的信息。
* e_type该成员确定该object的类型。
Name Value Meaning==== ===== =======ET_NONE 0 No file typeET_REL 1 Relocatable fileET_EXEC 2 Executable fileET_DYN 3 Shared object fileET_CORE 4 Core fileET_LOPROC 0xff00 Processor-specificET_HIPROC 0xffff Processor-specific虽然CORE的文件内容未被指明,类型ET_CORE是保留的。