Linux系统下的ELF文件分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux系统下的ELF文件分析
摘要:随着linux系统的发展,elf成了十分重要的可执行文件格式。本文介绍了eIf文件的格式,并在此基础上分析出eIf文件的特性。关键词:elf文件:平台相关PIC
1.引言
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文件的可移植性使交叉编译成为可能。目标文件类型用e type的值表示,可重定位文件为1,可执行文件为2,共享文件为3;加载相关信息有:程序进入点e_entry.程序头表偏移量e_phof,ellf头部长度e_eh-size.程序头表中一个条目的长度e_phentsize,程序头表条目数目e_ phnum;链接相关信息有:节头表偏移量e_shof,节头表中一个条目的长e.shentsize,节头表条目个数e ,节头表字符索_shnum引e shstmdx。可使用readelf—h filenam 来察看文件头的内容文件头的数据结构如下:
typedef struct elf32
一hdr{
unsigned char e
_ ident[EI—NIDENT];
Elf32. Half e. type;//目标文件类型
Elf32 Half e 硬件平台.
machine;//
Elf32 Word e version;//elf头部版本
Ell32 Addr e 程序进入点_
entry;//
Elf32. Of e. phof;//程序头表偏移量
Elf32. Of e. shof;//节头表偏移量
Ell32 Word e flags;//处理器特定标志
Elf32 Half e ehsize;//ellf头部长度
Elf32 Half e 程序头表中一个条目的长度_ phentsize;//
Ell32. Half e.,/程序头表条目数目.phnum;
Elf32 Half e shentsize;//节头表中一个条目的长度
Elf32
一Half e_ shnum;//节头表条目个数
Ell32. Half e shstrndx;//节头表字符索引
】Elf32一Ehdr;
2.4 程序头表(program header table)程序头表告诉系统如何建立一个进程映像.它是从加载执行的角度来看待elf文件.从它的角度看.elf文件被分成许多段,elf文件中的代码、链接信息和注释都以段的形式存放。每个段都在程序头表中有一个表项描述,包含以下属性:段的类型,段的驻留位置相对于文件开始处的偏移,段在内存中的首字节地址,段的物理地址,段在文件映像中的字节数.段在内存映像中的字节数段在内存和文件中的对齐标记。可用readelf—l filename察看程序头表中的内容。程序头表的结构如下:
typedef struct elf32_phdr{
Elf32_Wordp_type;
E1t32
_ Addr p_ paddr;//段的物理地址
Elf32_ Word p_ filesz;//段在文件映像中的字节数
Elf32一Word p_ memsz;//段在内存映像中的字节数
Elf32_ Word p_ flags;//段的标记
Elf32一Word p_align;,/段在内存中的对齐标记
)Elf32_Phdr;
2.5 节头表(section header table)
节头表描述程序节,为编译器和链接器服务。它把elf文件分成了许多节.每个节保存着用于不同目的的数据.这些数据可能被前面的程序头重复使用,完成一次任务所需的信息往往被分散到不同的节里。由于节中数据的用途不同,节被分成不同的类型,每种类型的节都有自己组织数据的方式。每一个节在节头表中都有一个表项描述该节的属性,节的属性包括小节名在字符表中的索引,类型,属性,运行时的虚拟地址,文件偏移,以字节为单位的大小,小节的对齐等信息,可使用readelf —S filename来察看节头表的内容。节头表的结构如下:
typedef struct{
Elf32.Word sh name;//4,节名在字符表中的索引
E1t32.Word sh tvpe;,/小节的类型
Elf32 Word sh flags;,/小节属性
Elf32 Addr sh ad ,//J、节在运行时的虚拟地址
E1t32 Of sh ofset;,/小节的文件偏移
Elf32
_ Word sh size;,/小节的大小.以字节为单位
Elf32一Word sh.1ink;//链接的另外一小节的索引
Elf32 Word sh
. info;//附加的小节信息
Elf32 Word sh addralign;,/小节的对齐
Elf32 Word sh
_ entsize;,/一些sections保存着一张固定大小
入口的表。就像符号表
1 Elf3
2 Shdr;,
3 ELF的特性
3.1平台相关
在ELF 文件头中包含了足够的平台相关信息,如数据编码方式,平台位数,硬件平台e_machine等,这些平台相关信息可在编译由编译器决定。例如,与平台位数的相关的数据结构的定义在elf.h的头文件中.在编译预处理时确定:椭f ELF CLASS==ELFCLASS32
extern Elf32
_ Dyn— DYNAMIC[];