2022年ELF文件格式学习 .pdf





《2022年ELF文件格式学习 .pdf》由会员分享,可在线阅读,更多相关《2022年ELF文件格式学习 .pdf(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Page 1 of 18ELF文件格式学习Daniel Wood 20110301转载时请注明出处和作者文章出处: http:/作者: Daniel Wood-写在前面的话:在阅读 TCP/IP 相关书籍的时候遇到ELF文件格式 (ELF 和 TCP/IP 无直接关系),所以查阅了网上很多这方面的资料,现在整理成篇,方便自己以后review 。如果你是 ELF 的高手,那么你可以跳过了,如果你和我一样,对ELF 文件格式一窍不通,或者你还未曾听说过这种格式(虽然你在平时工作中已经接触了很多这种格式的文件),那么你也许可以看看这篇基础的文章。如果你确实无聊的话,可以动手实践一下。参考文献:1 E
2、xecutable and Linkable Format (ELF).pdf 2 结合实例解读 ELF 文件-阅读笔记 bkbll(, ) 3 About ELF 4 5 自 UNIX 系统实验室 (USL)开发和发布了 Executable and linking Format(ELF)这样的二进制格式以后,在*nix 系统上 ELF 就取代了 out 可执行文件格式,成为了主要的目标文件格式。注:这里的目标文件是指(可暂时理解为)gcc 用 c,-o,-shared 所产生的 .o,可执行 (默认是 a.out),.so文件。1. ELF 文件类型目标文件(也就是ELF 文件)格式主要三
3、种:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 18 页 - - - - - - - - - Page 2 of 18可重定向文件( Relocatable ?le):文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件。由编译器和汇编器生成,将由链接器处理。可执行文件( Executable File):文件保存着一个用来执行的程序;该文件指出了 exec(BA_OS)如何来创建程序进程映象。所有重定向和符号都解析完成了,如
4、果存在共享库的链接,那么将在运行时解析。共享目标文件( Shared object ?le ):就是所谓的共享库。文件保存着代码和合适的数据,用来被下面的两个链接器链接。第一个是连接编辑器请参看 ld(SD_CMD) ,可以和其他的可重定向和共享目标文件来创建其他的目标文件。第二个是动态链接器,联合一个可执行文件和其他的共享目标文件来创建一个进程映象。包含链接时所需的符号信息和运行时所需的代码。下面用实例来了解这三种ELF 文件。代码 hello.c #include int main() printf(Hello Worldn); return 0; 用 gcc编译 hello.c 文件编译
5、环境:$ uname -a Linux ubuntu804 2.6.24-26-generic #1 SMP Tue Dec 1 18:37:31 UTC 2009 i686 GNU/Linux $ gcc -version gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu4) Copyright (C) 2007 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO 名师资料总结 - - -精品资料欢迎下载 -
6、- - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 18 页 - - - - - - - - - Page 3 of 18warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 1)编译重定向文件:$ gcc -c hello.c $file hello.o hello.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped 2)编译
7、可执行文件:$ gcc -o hello hello.o $ file hello hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.8, dynamically linked (uses shared libs), not stripped 可以用 ldd 命令查看 hello 这个可执行文件动态链接的共享库。$ ldd hello libc.so.6 = /lib/tls/i686/cmov/libc.so.6 (0 xb7d99000) /lib/ld-linux.so.2
8、 (0 xb7ef8000) 3)编译共享目标文件:$ gcc -shared hello.c -o hello.so $ file hello.so hello.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), not stripped 注:这里只是为了说明共享目标文件的ELF格式,这并不是平常的共享库,因为里面没有函数接口等东东。2. ELF 文件格式目标文件既要参与程序链接又要参与程序执行。出于方便性和效率考虑,目标文件格式提供了两种并行视图,分别反映了这些活动的不同需求。编译器,链接器把它看作是 secti
9、ons的集合, loader把它看作是 segments的集合。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 18 页 - - - - - - - - - Page 4 of 18表 1:Object File Format From:Executable and Linkable Format (ELF).pdf 一般的 ELF 文件包括三个索引表: ELF header ,Program header table,Section header table 。ELF
10、header :在文件的开始,保存了路线图(road map),描述了该文件的组织情况。Program header table:告诉系统如何创建进程映像。用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表。Section header table:包含了描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节区名称、节区大小这类信息。用于链接的目标文件必须包含节区头部表,其他目标文件可以有,也可以没有这个表。在 32 位的机器上,ELF 中各数据类型所占字节数,各类型定义可查看includelinuxelf.h :名师资料总结 - - -精品资料欢迎下载 - - -
11、- - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 18 页 - - - - - - - - - Page 5 of 18表 2:32-Bit Data Type From:Executable and Linkable Format (ELF).pdf 2.1 ELF header 文件的最开始几个字节给出如何解释文件的提示信息。这些信息独立于处理器,也独立于文件中的其余内容。ELF header 是一个elf32_hdr 结构体,定义在includelinuxelf.h #define EI_NIDENT 16 typede
12、f struct elf32_hdr unsigned char e_identEI_NIDENT; Elf32_Half e_type; Elf32_Half e_machine; Elf32_Word e_version; Elf32_Addr e_entry; /* Entry point */ Elf64_Off e_phoff; /* Program header table file offset */ Elf64_Off e_shoff; /* Section header table file offset */ Elf32_Word e_flags; Elf32_Half e
13、_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 18 页 - - - - - - - - - Page 6 of 18 Elf32_Half e_shstrndx; Elf32_Ehdr; 对照表2,Elf32_Half 占 2 个字节, unsigned char 占 1 个字节
14、,所以数组e_ident占 16 个字节,其他的 Elf32_Word,Elf32_Off ,Elf32_Addr 都占 4 个字节,所以得出Elf32_Ehdr 这个结构体总共占了52 个字节( 16+4*5+2*8=52 )。所以ELF 文件开头的 52个字节属于 ELF header,知道这点我们用hexdump,objdump,readelf等工具查看 ELF 文件的时候有用。用 readelf命令/工具去读上面产生的hello.o这个可重定向文件。这里我们只用readelf 命令的 -h 选项查看它们的ELF header ,以便对它有个感性认识 - $ readelf -h hel
15、lo.o ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2s complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: REL (Relocatable file) Machine: Intel 80386 Version: 0 x1 Entry point address: 0 x0 Start of program headers: 0 (b
16、ytes into file) Start of section headers: 232 (bytes into file) Flags: 0 x0 Size of this header: 52 (bytes) Size of program headers: 0 (bytes) Number of program headers: 0 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 18 页 - - - - - - - - - Page 7 of 18 Size o
17、f section headers: 40 (bytes) Number of section headers: 11 Section header string table index: 8 这是重定向文件hello.o 的 ELF header里面的内容,从这里可以狠清楚地看出Elf32_Ehdr 结构体中的内容。我们可以通过 hexdump命令/工具去查看 ELF 文件,它显示十六进制的内容。$ hexdump -C -n 52 hello.o 00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 |.ELF.| 0000001
18、0 01 00 03 00 01 00 00 00 00 00 00 00 00 00 00 00 |.| 00000020 e8 00 00 00 00 00 00 00 34 00 00 00 00 00 28 00 |.4.(.| 00000030 0b 00 08 00 |.| 00000034 下面结合readelf 和 hexdump 两个命令对ELF header 的查看结果来分析Elf32_Ehdr 结构体中各项的意义。首先是第一项 Elf32_Ehdr 结构体中的数组: unsigned char e_identEI_NIDENT; 数组 e_ident的下标是通过一组宏定义
19、去索引的。linux 代码版本是 2.6.29 #define EI_MAG0 0 /* e_ident indexes */ #define EI_MAG1 1 #define EI_MAG2 2 #define EI_MAG3 3 #define EI_CLASS 4 #define EI_DATA 5 #define EI_VERSION 6 #define EI_OSABI 7 #define EI_PAD 8 数组中各个成员代表不同的意义:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -
20、 - - 第 7 页,共 18 页 - - - - - - - - - Page 8 of 18表 3:e_ident Identi?cation IndexesFrom:Executable and Linkable Format (ELF).pdf e_ident数组前四项: e_identEI_MAG0. e_identEI_MAG3 e_ident数组总的前四项是一个Magic Number,代表这是一个ELF 文件。任何一个 ELF 文件的这四项值是固定的:表 4:Magic Number From:Executable and Linkable Format (ELF).pdf 相
21、对应的就是 hexdump -C -n 52 hello.o命令中得到的前面四个字节:7f 45 4c 46 ps:十六进制0 x45=十进制 69= E 十六进制 0 x4c=十进制 76= L 十六进制 0 x46=十进制 70= F第五项: e_identEI_CLASS:1字节: 01:32 位目标文件标识文件的类型,其值如下表名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 18 页 - - - - - - - - - Page 9 of 18表 5:value
22、of e_identEI_CLASS From:Executable and Linkable Format (ELF).pdf 第六项: e_identEI_DATA :1 字节: 01:高位在前。标识数据编码方式,不具体展开。第七项: e_identEI_VERSION:1 字节: 01:current version 表明 ELF header的版本号。e_type:2 字节: 01 00:可重定向文件。目标文件的类型,即可重定向,可执行,共享目标文件等。表 6:ELF file type From:Executable and Linkable Format (ELF).pdf e_m
23、achine :2 字节: 03 00:Intel 80386 目标体系结构类型,不展开。e_version :4 字节:01 00 00 00:current version。ELF 文件版本。e_entry:4 字节: 00 00 00 00:无程序入口。程序入口的虚拟地址。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 18 页 - - - - - - - - - Page 10 of 18e_phoff:4 字节: 00 00 00 00:偏移量为 0。Progr
24、am Header Table 的偏移量。e_shoff:4 字节: e8 00 00 00 :Section header table 偏移量为 0 xe8=232。Section Header Table的偏移量。e_flags:4 字节: 00 00 00 00。未指定。保存与文件相关的,特定于处理器的标志。 标志名称采用 EF_machine_flag 的格式e_ehsize :2 字节: 34 00:ELF header表头大小为 0 x34=52。ELF header的大小。e_phentsize :2 字节: 00 00:Program Header 大小为0,因为没有。每个Pr
25、ogram Header大小。e_phnum :2 字节: 00 00:Program Header总数为 0。Program Header的总数。e_shentsize :2 字节: 28 00:Section Header 大小为 0 x28=40。每个 Section Header大小。e_shnum :2字节: 0b 00:Section Header的总数为 0 x0b=11。Section Header的总数。e_shstrndx :2 字节: 08 00:索引值为 8。Section header string table index,Section的字符串表在 section
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年ELF文件格式学习 2022 ELF 文件格式 学习

限制150内