简单介绍一下Linux中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]串表. 串表的第一字节总是零, 其后所有串顺序存放.。
linux elf执行流程

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. 处理系统调用程序中可能会包含系统调用指令,用于请求操作系统提供各种服务。
当遇到系统调用指令时,操作系统会切换到内核态,执行相应的系统调用处理程序,并返回结果给用户程序。
了解在Linux下可执行文件格式

了解在Linux下可执行文件格式
Linux下面,目标文件、共享对象文件、可执行文件都是使用ELF文件格式来存储的。
程序经过编译之后会输出目标文件,然后经过链接可以产生可执行文件或者共享对象文件。
linux下面使用的ELF文件和Windows操作系统使用的PE文件都是从Unix 系统的COFF文件格式演化来的。
我们先来了解一些基本的想法。
首先,最重要的思路是一个程序从人能读懂的格式转换为供操作系统执行的二进制格式之后,代码和数据是分开存放的,之所以这样设计有这么几个原因:
1、程序执行之后,代码和数据可以被映射到不同属性的虚拟内存中。
因为代码一般是只读的,而数据是可读可写的;
2、现代CPU有强大的缓存体系。
程序和代码分离可以提高程序的局部性,增加缓存命中的概率;
3、还有最重要的一个原因是当有多个程序副本在运行的时候,只读部分可以只在内存中保留一份,这样大大节省了内存。
在ELF的定义中,把他们分开存放的地方称为一个Section ,就是一个段。
一个ELF文件中重要的段包括:
.text 段:存储只读程序
.data 段:存储已经初始化的全局变量和静态变量
.bss 段:存储未初始化的全局变量和静态变量,因为这些变量的值为0,所以这个段在文件当中不占据空间
.rodata 段:存储只读数据,比如字符串常量
我们用一个例子来看一下ELF文件的格式到底是什么。
首先,在Linux下编写一个C程序:SimpleSecTIon.c
[cpp] view plain copy
int printf(const char *format, ... );。
可执行文件(ELF)格式的理解=.

可执行文件(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文档。
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。
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是英文Executable and Linkable Format的缩写,即可执行和可链接格式。
它是一种通用的二进制文件格式,常用于Linux和UNIX类操作系统以及其他一些嵌入式系统中。
对于Linux来说,ELF格式的可执行文件是Linux系统下常见的一种可执行文件格式。
ELF文件由多个节(Section)组成。
每个节都有一个唯一的名称,用来描述程序中的一种特定类型的数据。
主要的节类型包括.text、.data、.bss以及.symtab等。
每种节类型都有自己的作用和特定的内容。
.text节是可执行文件中最重要的节,它包含了程序的代码。
在Linux系统中,函数的执行是由.text节中的代码驱动的。
.data节用于存储一些静态的全局变量,.bss节则用于存储一些未初始化的全局变量。
.symtab节是符号表,用于记录程序中的所有符号,包括函数和变量等等。
在ELF文件中,函数的定义和调用是通过符号表来实现的。
符号表中记录了所有的符号信息,包括符号名称、符号类型、符号值等等。
函数被定义时,在符号表中会被记录一个符号类型为函数的符号。
而函数被调用时,程序会在符号表中查找该函数的符号信息,并跳转到该函数的代码地址开始执行。
在ELF文件中,具体的函数实现是由函数的代码段来实现的。
函数的执行流程是先把函数的参数压入栈中,然后通过调用指令跳转到函数代码段的入口处开始执行。
在函数执行过程中,栈用于存储函数的局部变量、临时变量以及一些返回值等等。
函数的返回是通过返回指令来实现的。
在函数执行完成后,程序会使用返回指令返回到函数调用点的下一条指令处。
如果函数有返回值,那么返回值也会存储在寄存器或者栈中,并在返回时传递给函数调用点。
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文件的结构,我们可以获得有关程序入口点、机器类型、节的信息等重要的元数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
简单介绍一下Linux中ELF格式文件
ELF(Executable and Linkable Format)即可执行连接文件格式,是一种比较复杂的文件格式,但其应用广泛。
与linux下的其他可执行文件(a.out,cof)相比,它对节的定义和gnu工具链对它的支持使它十分灵活,它保存的足够了系统相关信息使它能支持不同平台上的交叉编译和交叉链接,可移植性很强.同时它在执行中支持动态链接共享库。
通过本文,可以大致了解Linux系统中ELF格式文件的分类,组成,作用,以及其中包含的内容。
另外后面介绍了几种常用的对elf文件进行操作的工具,并且对其使用进行简单举例,便于对elf文件有一个比较直观的理解。
主要内容:
[描述]
1 ELF文件简介
2 ELF文件格式
3 ELF的特性
[举例]
1 readelf工具
2 objcopy工具
3 objdump工具
4 nm工具
5 ldd工具
[其它]
[描述]
1 ELF文件简介
ELF(Executable and Linkable Format)即可执行连接文件格式,是Linux,SVR4和Solaris2.0默认的目标文件格式,目前标准接口委员会TIS已将ELF标准化为一种可移植的目标文件格式,运行于32-bit Intel体系微机上,可与多种操作系统兼容。
分析elf文件有助于理。