elf文件标准
elf文件格式

第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文件结构描述3.4 ELF文件结构描述我们已经通过SimpleSection.o的结构大致了解了ELF文件的轮廓,接着就来看看ELF 文件的结构格式。
图3-4描述的是ELF目标文件的总体结构,我们省去了ELF一些繁琐的结构,把最重要的结构提取出来,形成了如图3-4所示的ELF文件基本结构图,随着我们讨论的展开,ELF文件结构会在这个基本结构之上慢慢变得复杂起来。
ELF目标文件格式的最前部是ELF文件头(ELF Header),它包含了描述整个文件的基本属性,比如ELF文件版本、目标机器型号、程序入口地址等。
紧接着是ELF文件各个段。
其中ELF文件中与段有关的重要结构就是段表(Section Header Table),该表描述了ELF文件包含的所有段的信息,比如每个段的段名、段的长度、在文件中的偏移、读写权限及段的其他属性。
接着将详细分析ELF文件头、段表等ELF关键的结构。
另外还会介绍一些ELF中辅助的结构,比如字符串表、符号表等,这些结构我们在本节只是简单介绍一下,到相关章节中再详细展开。
3.4.1 文件头我们可以用readelf命令来详细查看ELF文件,代码如清单3-2所示。
ELF文件头结构及相关常数被定义在“/usr/include/elf.h”里,因为ELF文件在各种平台下都通用,ELF文件有32位版本和64位版本。
它的文件头结构也有这两种版本,分别叫做“Elf32_Ehdr”和“Elf64_Ehdr”。
32位版本与64位版本的ELF文件的文件头内容是一样的,只不过有些成员的大小不一样。
为了对每个成员的大小做出明确的规定以便于在不同的编译环境下都拥有相同的字段长度,“elf.h”使用typedef定义了一套自己的变量体系,如表3-3所示。
我们这里以32位版本的文件头结构“Elf32_Ehdr”作为例子来描述,它的定义如下:让我们拿ELF文件头结构跟前面readelf输出的ELF文件头信息相比照,可以看到输出的信息与ELF文件头中的结构很多都一一对应。
GCC编译器原理(二)------编译原理一:ELF文件(2)

GCC编译器原理(⼆)------编译原理⼀:ELF⽂件(2)四、 ELF ⽂件格式分析ELF⽂件(⽬标⽂件)格式主要四种:可重定向⽂件:⽂件保存着代码和适当的数据,⽤来和其他的⽬标⽂件⼀起来创建⼀个可执⾏⽂件或者是⼀个共享⽬标⽂件。
(⽬标⽂件或者静态库⽂件,即linux通常后缀为 .a 和 .o 的⽂件)可执⾏⽂件:⽂件保存着⼀个⽤来执⾏的程序。
(例如bash,gcc等)共享⽬标⽂件:共享库。
⽂件保存着代码和合适的数据,⽤来被下连接编辑器和动态链接器链接。
(linux下后缀为 .so 的⽂件。
)执⾏⽂件的格式与上述两种⽂件的格式之间的区别主要在于观察的⾓度不同:⼀种称为连接视图(Linking View),⼀种称为执⾏视图(Execution View)核⼼转储⽂件(core dump):当进程意外终⽌时,系统可以将该进程的地址空间的内容及终⽌时的⼀些其他信息转储到核⼼转储⽂件⽬标⽂件既要参与程序链接⼜要参与程序执⾏。
出于⽅便性和效率考虑,⽬标⽂件格式提供了两种并⾏视图,分别反映了这些活动的不同需求。
ELF header:ELF ⽂件头包含了描述整个⽂件的基本属性,⽐如 ELF ⽂件版本、⽬标机器型号、程序⼊⼝地址等等Program header table:程序表头。
如果存在的话,告诉系统如何创建进程映像。
⽤来构造进程映像的⽬标⽂件必须具有程序头部表,可重定位⽂件不需要这个表Section or Segment:节或段ELF ⽂件中包含的各个节,具体见后⾯章节。
Section header table:节头表,可选每个节区在表中都有⼀项,描述了 ELF ⽂件包含的所有节的信息,⽐如每个节的节名、节的长度、在⽂件中的偏移、读写权限及段的其他属性⽤于链接的⽬标⽂件必须包含节区头部表,其他⽬标⽂件可以有,也可以没有这个表。
String tables:字符串表Symbol tables:符号表注意:尽管图中显⽰的各个组成部分是有顺序的,实际上除了 ELF 头部表以外,其他节区和段都没有规定的顺序。
ELF文件格式

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文件格式分析

ELF⽂件格式分析⼀般的 ELF ⽂件包括三个索引表:ELF header,Program header table,Section header table。
1)ELF header:在⽂件的开始,保存了路线图,描述了该⽂件的组织情况。
2)Program header table:告诉系统如何创建进程映像。
⽤来构造进程映像的⽬标⽂件必须具有程序头部表,可重定位⽂件不需要这个表。
3)Section header table :包含了描述⽂件节区的信息,每个节区在表中都有⼀项,每⼀项给出诸如节区名称、节区⼤⼩这类信息。
⽤于链接的⽬标⽂件必须包含节区头部表,其他⽬标⽂件可以有,也可以没有这个表。
⼀、分析ELF⽂件头vi /usr/include/elf.h查看elf头数据结构⽤readelf –h 1(可执⾏⽂件名)读取⼀个简单可执⾏⽂件的elf头可见elf头⼤⼩为52字节,⽤dump命令16进制读取前52个字节进⾏分析命令:hexdump –x 1 –n 52解析:第⼀⾏,对应e_ident[EI_NIDENT]。
⼩端法实际表⽰内容为7f454c46010101000000000000000000,前四个字节为elf固定开头7f454c46(0x45,0x4c,0x46是'e','l','f'对应的ascii编码),表⽰这是⼀个ELF对象。
接下来的⼀个字节01表⽰是⼀个32位对象,接下来的⼀个字节01表⽰是⼩端法表⽰,再接下来的⼀个字节01表⽰⽂件头版本。
剩下的默认都设置为0.第⼆⾏,e_type值为0x0002,表⽰是⼀个可执⾏⽂件。
e_machine值为0x0003,表⽰是intel80386处理器体系结构。
e_version值为0x00000001,表⽰是当前版本。
e_entry值为0x08048320,表⽰⼊⼝点。
e_phoff值为0x00000034,表⽰程序头表的偏移量为0x34即52个字节刚好是elf头⼤⼩。
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文件格式的详解
ELF文件格式的详解ELF文件格式的详解•1.说明•2.elf文件的基本格式•3.elf文件的头部信息•4.elf文件的节区(Section)o 4.1 节区的作用o 4.2 节区的组成•5.elf文件的段(Segment)•6.用python解析elf文件•7.总结1.说明ELF的英文全称是The Executable and Linking Format,最初是由UNIX系统实验室开发、发布的ABI(Application Binary Interface)接口的一部分,也是Linux的主要可执行文件格式。
从使用上来说,主要的ELF文件的种类主要有三类:•可执行文件(.out):Executable File,包含代码和数据,是可以直接运行的程序。
其代码和数据都有固定的地址(或相对于基地址的偏移),系统可根据这些地址信息把程序加载到内存执行。
•可重定位文件(.o文件):Relocatable File,包含基础代码和数据,但它的代码及数据都没有指定绝对地址,因此它适合于与其他目标文件链接来创建可执行文件或者共享目标文件。
•共享目标文件(.so):Shared Object File,也称动态库文件,包含了代码和数据,这些数据是在链接时被链接器(ld)和运行时动态链接器(ld.so.l、libc.so.l、ld-linux.so.l)使用的。
本文主要从elf文件的组成构造的角度来进行分析,将elf文件的解析通过一步一步的分析得到里面的信息,同时通过python脚本解析,可以直观的看到文件的信息,通过本文的阅读,将对elf文件格式有着更加深刻的理解。
2.elf文件的基本格式elf文件是有一定的格式的,从文件的格式上来说,分为汇编器的链接视角与程序的执行视角两种去分析ELF文件。
从程序执行视角来说,这就是Linux加载器加载的各种Segment 的集合。
比如只读代码段、数据的读写段、符号段等等。
而从链接的视角上来看,elf又分为各种的sections。
含大量图文解析及例程Linux下的ELF文件、链接、加载与库(上)
含大量图文解析及例程Linux下的ELF文件、链接、加载与库(上)常用工具我们首先列出一些在接下来的介绍过程中会频繁使用的分析工具,如果从事操作系统相关的较底层的工作,那这些工具应该再熟悉不过了。
不熟悉的读者可以先看一下这里的简单的功能介绍,我们会在后文中介绍一些详细的参数选项和使用场景。
另外,建议大家在遇到自己不熟悉的命令时,通过 man 命令来查看手册,这是最权威的、第一手的资料。
ELF文件详解ELF文件的三种形式在Linux下,可执行文件/动态库文件/目标文件(可重定向文件)都是同一种文件格式,我们把它称之为ELF文件格式。
虽然它们三个都是ELF文件格式但都各有不同。
以下文件的格式信息可以通过file 命令来查看。
1.可重定位(relocatable)目标文件:通常是.o文件。
包含二进制代码和数据,其形式可以再编译时与其他可重定位目标文件合并起来,创建一个可执行目标文件。
2.可执行(executable)目标文件:是完全链接的可执行文件,即静态链接的可执行文件。
包含二进制代码和数据,其形式可以被直接复制到内存并执行。
3.共享(shared)目标文件:通常是.so动态链接库文件或者动态链接生成的可执行文件。
一种特殊类型的可重定位目标文件,可以在加载或者运行时被动态地加载进内存并链接。
注意动态库文件和动态链接生成的可执行文件都属于这一类。
会在最后一节辨析时详细区分。
因为我们知道ELF的全称:Executable and Linkable Format,即”可执行、可链接格式“,很显然这里的三个ELF文件形式要么是可执行的、要么是可链接的。
其实还有一种core文件,也属于ELF文件,在core dumped时可以得到。
我们这里暂且不提。
注意:在Linux中并不以后缀名作为区分文件格式的绝对标准。
节头部表和程序头表和ELF头在我们的ELF文件中,有两张重要的表:节头部表(Section Tables)和程序头表(Program Headers)。
ELF相比Hex、Bin文件格式有哪些与众不同?
ELF相比Hex、Bin文件格式有哪些与众不同?素材来源:综合CSDN编辑整理:strongerHuang关于计算机的文件有很多种,今天分享一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。
一、ELF文件简介ELF:Executable and Linkable Format,可执行与可链接格式。
首先,你需要知道的是所谓对象文件(Object files)有三个种类:1)可重定向文件:文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件。
(目标文件或者静态库文件,即通常后缀为.a和.o的文件)2)可执行文件:文件保存着一个用来执行的程序。
(例如bash,gcc等)3)共享目标文件:共享库。
文件保存着代码和合适的数据,用来被下连接编辑器和动态链接器链接。
二、ELF文件格式首先,ELF文件格式提供了两种视图,分别是链接视图和执行视图。
链接视图是以节(section)为单位,执行视图是以段(segment)为单位。
链接视图就是在链接时用到的视图,而执行视图则是在执行时用到的视图。
上图左侧的视角是从链接来看的,右侧的视角是执行来看的。
总个文件可以分为四个部分:•ELF header:描述整个文件的组织。
•Program Header T able: 描述文件中的各种segments,用来告诉系统如何创建进程映像的。
•sections 或者 segments:segments是从运行的角度来描述elf 文件,sections是从链接的角度来描述elf文件,也就是说,在链接阶段,我们可以忽略program header table来处理此文件,在运行阶段可以忽略section header table来处理此程序(所以很多加固手段删除了section header table)。
从图中我们也可以看出,segments与sections是包含的关系,一个segment包含若干个section。
BIN、HEX、AXF、ELF文件格式有什么区别
BIN、HEX、AXF、ELF文件格式有什么区别数据量比较从存储数据的信息量上看:ELF>AXF>HEX>BIN,所以这也就确定了只能将大信息量的文件格式向小信息量的文件格式转换,如只能将HEX文件转换为BIN文件,当然如果指定了下载地址,也可以将BIN转换为HEX文件。
BIN文件bin文件是纯粹的机器码,没有地址信息,不能使用记事本直接打开,要使用bin文件阅读器才能打开,如果使用bin文件烧录程序时,需要指定下载地址。
一些下载器只能使用BIN文件进行下载,在进行OTA远程升级时必须使用bin文件。
HEX文件一般是指Intel标准的hex文件,可以使用记事本直接打开,是十六进制数据,包含了基地址、偏移量、校验和、文件开始和结束标志等信息,与bin文件最大的不同就是包含了下载地址。
由于hex文件是十六进制数据,而bin文件是二进制数据,如十六进制0xFF,用二进制表示为1111 1111,所以HEX文件要比bin文件大得多。
与axf文件相比,不含调试信息,不能用于调试。
AXF文件包含了调试信息,如进行在Keil环境使用Debug功能时,就是先将axf文件下载到芯片内,才能进行调试。
如使用J-Link的J-Scope功能时,必须使用axf文件。
ELF文件是由GCC编译器生成的。
elf文件可以直接转换为hex和bin,但hex和bin例如Linux系统下使用gcc指令gcc -o test test.c生成的elf文件,可以通过./test直接执行。
总结:1. bin文件可以由hex和axf文件转换而来。
2. axf文件包含了调试信息。
3. hex文件包含了烧录地址,而bin文件不含,需要指定地址。
欢迎各位朋友互相交流学习!。