elf-linux文件格式
- 格式:pdf
- 大小:124.82 KB
- 文档页数:60
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 ELF(可执行与可链接格式)是一种用于表示可执行文件和共享库的文件格式。
在ELF文件中,符号表是一个非常重要的组成部分,它包含了程序中所有变量、函数和其他符号的定义信息。
符号表中的每个条目都包含以下字段:
1.名称(Name):符号的名称,通常是变量名、函数名或其他标识符。
2.类型(Type):符号的类型,可以是全局变量、局部变量、函数等。
3.值(Value):符号的值,对于全局变量和静态变量,它是其内存地址;对
于局部变量,它是其在栈中的偏移量;对于函数,它是其入口点地址。
4.大小(Size):符号的大小,对于全局变量和静态变量,它是其数据类型的
大小;对于局部变量,它通常为0;对于函数,它通常是其代码段的大小。
5.绑定(Binding):符号的绑定方式,可以是本地(local)、全局(global)
或弱全局(weak global)。
6.可见性(Visibility):符号的可见性,可以是默认(default)、内部
(internal)、外部(external)或隐藏(hidden)。
7.其他属性(Other Attributes):符号的其他属性,如线程局部存储(thread
local storage)等。
通过解析ELF文件的符号表,可以获取程序中所有变量、函数和其他符号的定义信息,从而进行调试、分析和优化等操作。
了解在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格式之前,先简单说明一下可执行文件的生成流程: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是英文Executable and Linkable Format的缩写,即可执行和可链接格式。
它是一种通用的二进制文件格式,常用于Linux和UNIX类操作系统以及其他一些嵌入式系统中。
对于Linux来说,ELF格式的可执行文件是Linux系统下常见的一种可执行文件格式。
ELF文件由多个节(Section)组成。
每个节都有一个唯一的名称,用来描述程序中的一种特定类型的数据。
主要的节类型包括.text、.data、.bss以及.symtab等。
每种节类型都有自己的作用和特定的内容。
.text节是可执行文件中最重要的节,它包含了程序的代码。
在Linux系统中,函数的执行是由.text节中的代码驱动的。
.data节用于存储一些静态的全局变量,.bss节则用于存储一些未初始化的全局变量。
.symtab节是符号表,用于记录程序中的所有符号,包括函数和变量等等。
在ELF文件中,函数的定义和调用是通过符号表来实现的。
符号表中记录了所有的符号信息,包括符号名称、符号类型、符号值等等。
函数被定义时,在符号表中会被记录一个符号类型为函数的符号。
而函数被调用时,程序会在符号表中查找该函数的符号信息,并跳转到该函数的代码地址开始执行。
在ELF文件中,具体的函数实现是由函数的代码段来实现的。
函数的执行流程是先把函数的参数压入栈中,然后通过调用指令跳转到函数代码段的入口处开始执行。
在函数执行过程中,栈用于存储函数的局部变量、临时变量以及一些返回值等等。
函数的返回是通过返回指令来实现的。
在函数执行完成后,程序会使用返回指令返回到函数调用点的下一条指令处。
如果函数有返回值,那么返回值也会存储在寄存器或者栈中,并在返回时传递给函数调用点。
ELF文件不仅可以包含可执行代码,还可以包含动态链接库和静态链接库。
动态链接库在程序运行时才会被加载,而静态链接库是在编译时被链接到程序中的。
使用静态链接库可以使程序的可执行文件更小,但动态链接库可以使多个程序共享库中的代码,从而减少程序运行时的内存占用。
Android平台ELF⽂件格式ELF英⽂全程为:Executable Linkable Format,ELF属于Linux平台下可执⾏⽂件。
ELF⽂件格式与Windows下的PE(Portable Executable)⽂件格式相似,都是属于COFF(Common File Format)⽂件格式变种。
⾕歌的Android操作系统内核采⽤Linux内核框架实现,所以Android平台原⽣⽂件格式与Linux可执⾏⽂件格式完全相似,同属于ELF类型⽂件。
Android平台下游戏逻辑通常使⽤C、C++语⾔实现,编译之后的可执⾏⽂件属于ELF⽂件格式,ELF⽂件格式整体布局如下图所⽰:⾕歌的Android NDK提供⼯具⽅便开发者查看ELF⽂件格式,对应⼯具名为:arm-linux-androideabi-readelf,⼯具所在NDK 根⽬录的相对路径为:android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows-x86_64\bin\,arm-linux-androideabi-readelf⼯具部分使⽤说明如下图所⽰:本章使⽤“libTest.so”⽂件作为实例介绍ELF格式信息。
下⾯将详细讲解ELF⽂件格式,以便让读者对Android平台原⽣程序的⽂件格式有较好理解。
1.1.1⽂件头信息ELF⽂件头描述⽂件基本属性信息,包括ELF⽂件版本号、⽬标机器型号、程序⼊⼝、段表描述信息等信息。
ELF⽂件头数据⼤⼩为0x34字节,实例⽂件的ELF⽂件头信息⼆进制数据如下所⽰:上图中标为蓝⾊的数据为ELF⽂件头⼆进制内存数据,最右边可明显看出有“ELF”字符串,读者也许已猜到数据对应ELF⽂件标志,即判断是否为ELF⽂件表⽰。
arm-linux-androideabi-readelf⼯具可⽅便查看ELF⽂件头信息。
利⽤arm-linux-androideabi-readelf⼯具查看ELF⽂件头信息命令如下:arm-linux-androideabi-readelf.exe -h libTest.so对应获取的⽂件头信息如下:上图重要信息解释如下:Magic:表⽰魔数标志信息,⽤来指明该⽂件是⼀个ELF⽬标⽂件,第⼀个字节固定为“7F”,后⾯三个字节为E、L、F字母的ASCII数值。
linux下的三种可执⾏⽂件格式的⽐较linux下的三种可执⾏⽂件格式的⽐较本⽂讨论了 UNIX/LINUX 平台下三种主要的可执⾏⽂件格式:a.out(assembler and link editor output 汇编器和链接编辑器的输出)、COFF(Common Object File Format 通⽤对象⽂件格式)、ELF(Executable and Linking Format 可执⾏和链接格式)。
⾸先是对可执⾏⽂件格式的⼀个综述,并通过描述 ELF ⽂件加载过程以揭⽰可执⾏⽂件内容与加载运⾏操作之间的关系。
随后依此讨论了此三种⽂件格式,并着重讨论 ELF ⽂件的动态连接机制,其间也穿插了对各种⽂件格式优缺点的评价。
最后对三种可执⾏⽂件格式有⼀个简单总结,并提出作者对可⽂件格式评价的⼀些感想。
可执⾏⽂件格式综述相对于其它⽂件类型,可执⾏⽂件可能是⼀个操作系统中最重要的⽂件类型,因为它们是完成操作的真正执⾏者。
可执⾏⽂件的⼤⼩、运⾏速度、资源占⽤情况以及可扩展性、可移植性等与⽂件格式的定义和⽂件加载过程紧密相关。
研究可执⾏⽂件的格式对编写⾼性能程序和⼀些⿊客技术的运⽤都是⾮常有意义的。
不管何种可执⾏⽂件格式,⼀些基本的要素是必须的,显⽽易见的,⽂件中应包含代码和数据。
因为⽂件可能引⽤外部⽂件定义的符号(变量和函数),因此重定位信息和符号信息也是需要的。
⼀些辅助信息是可选的,如调试信息、硬件信息等。
基本上任意⼀种可执⾏⽂件格式都是按区间保存上述信息,称为段(Segment)或节(Section)。
不同的⽂件格式中段和节的含义可能有细微区别,但根据上下⽂关系可以很清楚的理解,这不是关键问题。
最后,可执⾏⽂件通常都有⼀个⽂件头部以描述本⽂件的总体结构。
相对可执⾏⽂件有三个重要的概念:编译(compile)、连接(link,也可称为链接、联接)、加载(load)。
源程序⽂件被编译成⽬标⽂件,多个⽬标⽂件被连接成⼀个最终的可执⾏⽂件,可执⾏⽂件被加载到内存中运⾏。
linux,windows可执⾏⽂件(ELF、PE)现在PC平台流⾏的可执⾏⽂件格式(Executable)主要是Windows下的PE(Portable Executable)和Linux的ELF(Executable Linkable Format),它们都是COFF(Common file format)格式的变种。
不光是可执⾏⽂件(Windows的.exe和Linux下的ELF可执⾏⽂件)按照可执⾏⽂件格式存储。
动态链接库(DLL,Dynamic Linking Library)(Windows的.dll和Linux的.so)及静态链接库(Static Linking Library)(Windows的.lib和Linux的.a)⽂件都按照可执⾏⽂件格式存储。
它们在Windows下都按照PE-COFF格式存储,Linux下按照ELF格式存储。
什么⼜是COFF格式呢?COFF是由Unix System V Release 3⾸先提出并且使⽤的格式规范,后来微软公司基于COFF格式,制定了PE格式标准,并将其⽤于当时的Windows NT系统。
System V Release 4在COFF的基础上引⼊了ELF格式,⽬前流⾏的Linux系统也以ELF作为基本可执⾏⽂件格式。
这也就是为什么⽬前PE和ELF如此相似的主要原因,因为它们都是源于同⼀种可执⾏⽂件格式COFF。
Unix最早的可执⾏⽂件格式为a.out格式,它的设计⾮常地简单,以⾄于后来共享库这个概念出现的时候,a.out格式就变得捉襟见肘了。
于是⼈们设计了COFF格式来解决这些问题,这个设计⾮常通⽤,以⾄于COFF的继承者到⽬前还在被⼴泛地使⽤。
COFF的主要贡献是在⽬标⽂件⾥⾯引⼊了“段”的机制,不同的⽬标⽂件可以拥有不同数量及不同类型的“段”。
另外,它还定义了调试数据格式。
⽬标⽂件有三种类型:1. 可重定位⽂件(Relocatable File)包含适合于与其他⽬标⽂件链接来创建可执⾏⽂件或者共享⽬标⽂件的代码和数据。
Linux系统下的ELF文件分析摘要:随着linux系统的发展,elf成了十分重要的可执行文件格式。
本文介绍了eIf文件的格式,并在此基础上分析出eIf文件的特性。
关键词:elf文件:平台相关PIC1.引言ELF(Executable and Linkable Format)IN可执行连接文件格式.是LinuxSVR4和Solaris2,0默认的目标文件格式,目前标准接口委员会TIS已将ELF标准化为一种可移植的目标文件格式,运行于32一bitIntel体系微机上,可与多种操作系统兼容。
分析elf文件有助于理解一些重要的系统概念,例如程序的编译和链接,程序的加载和运行等2.ELF文件格式2.1 ELF文件的类型ELF文件主要有三种类型(1)可重定位文件包含了代码和数据.可与其它ELF文件建立一个可执行或共享的文件:(2)可执行文件时可直接执行的程序:(3)共享目标文件包括代码和数据,可以在两个地方链接。
第一,连接器可以把它和其它可重定位文件和共享文件一起处理以建立另一个ELF文件;第二,动态链接器把它和一个可执行文件和其它共享文件结合在一起建立一个进程映像。
2.2 ELF文件的组织ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序),编译器和链接器将其视为节头表(section headertable)描述的一些节(section)的集合,而加载器则将其视为程序头表(program header table)描述的段(segment)的集合,通常一个段可以包含多个节。
可重定位文件都包含一个节头表.可执行文件都包含一个程序头表。
共享文件两者都包含有。
为此,ELF文件格式同时提供了两种看待文件内容的方式,反映了不同行为的不同要求。
2.3文件头EIF头在在程序的开始部位,作为引路表描述整个ELF的文件结构,其信息大致分为四部分:一是系统相关信息,二是目标文件类型,三是加载相关信息,四是链接相关信息其中系统相关信息包括elf文件魔数(标识elf文件),平台位数,数据编码方式,elf头部版本,硬件平台e machine,目标文件版本e_version,处理器特定标志e ftags:这些信息的引入极大增强了elf文件的可移植性使交叉编译成为可能。