elf文件格式
- 格式:doc
- 大小:60.50 KB
- 文档页数:5
linux elf执行流程Linux ELF 执行流程ELF(Executable and Linkable Format)是Linux系统中可执行文件的一种格式。
在Linux下,当我们执行一个可执行文件时,操作系统会按照一定的流程解析和执行该文件。
本文将介绍Linux ELF 的执行流程。
1. ELF文件格式ELF文件由多个段(section)组成,每个段都有特定的作用。
常见的段包括.text段(包含程序的指令)、.data段(包含程序的全局变量和静态变量)、.bss段(包含未初始化的全局变量和静态变量)等。
2. 加载可执行文件当用户在终端输入可执行文件名并按下回车键时,操作系统会通过解析文件头判断该文件是否为有效的ELF文件。
如果是有效的ELF 文件,操作系统会为该进程分配一块内存空间,并将ELF文件中的各个段加载到相应的内存地址上。
3. 解析程序入口操作系统会根据ELF文件中的程序入口地址(Entry Point)来确定程序的入口点。
程序入口地址通常位于.text段的起始位置。
操作系统将程序计数器(PC)设置为程序入口地址,从而开始执行程序。
4. 执行程序指令程序从程序入口地址开始执行,按照顺序执行.text段中的指令。
每条指令都会被解码和执行,直到程序结束或者遇到跳转指令。
5. 解析跳转指令在程序执行过程中,可能会遇到跳转指令(如条件跳转、无条件跳转、函数调用等)。
当遇到跳转指令时,操作系统会根据指令中的目标地址重新设置程序计数器,从而改变程序的执行流程。
6. 处理函数调用当程序执行到函数调用指令时,操作系统会将函数的返回地址和参数等信息保存到栈中,并跳转到函数的入口地址执行。
函数执行完毕后,操作系统会从栈中恢复返回地址,继续执行函数调用指令后面的指令。
7. 处理系统调用程序中可能会包含系统调用指令,用于请求操作系统提供各种服务。
当遇到系统调用指令时,操作系统会切换到内核态,执行相应的系统调用处理程序,并返回结果给用户程序。
ARM之⼀ELF⽂件、镜像(Image)⽂件、可执⾏⽂件、对象⽂件详解【转】ELF ⽂件规范 ELF(Executable and Linking Format)是⼀个⼆进制⽂件规范。
⽤于定义不同类型的对象⽂件(Object files)中都放了什么东西、以及都以什么样的格式去放这些东西。
现在流⾏的⼆进制可执⾏⽂件格式 (Executable File Format),主要是 Windows 下的 PE(Portable Executable)和 Linux 的 ELF(Executable and Linking Format)可执⾏和链接格式)。
他们都是 COFF(Common Object File Format)的变种。
ARM 体系中采⽤的也是 ELF ⽂件格式。
COFF 是在 Unix System V Release 3 时由 UNIX 系统实验室(UNIX System Laboratories, USL)⾸先提出并且使⽤的⽂件规范,后来微软公司基于 COFF 格式,制定了PE 格式标准,并将其⽤于当时的 Windows NT 系统。
在 System V Release 4 时,UNIX 系统实验室在 COFF 的基础上,开发和发布了 ELF 格式,作为应⽤程序⼆进制接⼝(Application Binary Interface,ABI)。
此后,⼯具接⼝标准委员会(Tool Interface Standard Committee,TISC)选择了正在发展中的 ELF 标准作为⼯作在 32 位 INTEL 体系上不同操作系统之间可移植的⼆进制⽂件格式。
可以从这⾥找到详细的标准⽂档。
如下图:TISC 共出过两个版本(v1.1和 v1.2)的标准⽂档。
两个版本内容上差不多,但 v1.2 版本重新组织了原本在 v1.1 版本中的内容。
可读性更⾼。
两个版本的⽬录如下所⽰:在 ELF ⽂件规范中,把系统中采⽤ ELF 格式的⽂件(规范中称为对象⽂件(Object File))归类为以下三种:可重定位⽂件(Relocatable File ):这类⽂件包含代码和数据,可⽤来连接成可执⾏⽂件或共享对象⽂件(Object File),静态链接库归为此类,对应于Linux 中的.o ;Windows 的 .obj.可执⾏⽂件(Executable File ):这类⽂件包含了可以直接执⾏的程序,它的代表就是ELF 可执⾏⽂件。
ELF可执行文件的解析与加载ELF文件格式简介1.1前言ELF-可执行链接格式最初是由UNIX系统实验室(USL)作为应用程序二进制接口(ABI)开发和发行。
工具接口标准委员会TIS已经将ELF作为运行在Intel32位架构之上的各类型操作系统的可导出对象文件格式标准。
ELF标准为开发者提供了一组横跨多运行环境的二进制接口定义来组织软件开发。
1.2对象文件1.2.1 介绍本部分描述了ABI对象文件格式,也称之为ELF。
有三种主要类型的对象文件:1. 可重组(relocatable)文件包含了适合用来链接其他对象文件的代码和数据,从而创建出可执行或可共享的对象文件;2. 可执行(executable)文件包含了用于执行的程序,该文件规定了exec如何创建一个程序的进程映像;3. 可共享对象(shared object)文件包含了用来在两个上下文之间链接的代码和数据。
首先,链接器ld将该文件和其他的可重组文件或可共享对象文件进行处理后,创建出新对象文件,其次,动态链接器将该新对象文件与可执行文件或共享对象组合,来共同创建一个进程映像;经过汇编器以及链接器创建成的对象文件,其是在处理器上可直接执行的程序的二进制代表。
本部分主要描述文件格式以及其如何用来构建程序。
后一部分也描述了对象文件,集中在程序执行所必须的信息上。
1.2.1.1 文件格式在程序链接和程序执行过程都涉及到对象文件。
出于方便和效率,对象文件格式图从链接和运行两个视角来展示文件的内容。
ELF header位于文件的开始处,其用来描述文件的组织结构。
Section包含了大量的对象文件信息,从链接的视角来看就是指令、数据、符号表、重组信息等等。
Segment和Program是从程序执行视角来观看的,这将在下部分讲解。
如果存在Program Header table的话,其将告诉操作系统如何创建进程映像。
用来创建进程映像(执行程序)的文件必须包含program header table。
序言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文件格式•目标文件有三种类型:–可重定位文件(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,保存字符窜信息。
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(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)等。
第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 16
typedef 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 Headers
ELF文件中的每个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 Sections
1.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]串表. 串表的第一字节总是零, 其后所有串顺序存放.。