分析ELF文件:
首先编写一个.c文件,并使用gcc -c xx.c -o xx.o 对其进行编译。
我在这个实践中是ELF_1.o文件。
接下来输入ls -l ELF_1.o 查看重定位文件的信息。
接下来以十六进制来查看该文件信息。输入:hexdump -x ELF_1.o
显示信息的最左一列表示的是偏移地址的16进制表示。
查看ELF文件头定义的规范。打开elf.h查看各部分内容的定义。
我们可以看出,32位的系统与64位的系统的ELF头部分结构大致相同。只是个别字段所占用的字节个数有不同罢了。
分析一下ELF头:
第一行:第一部分:占四个字节。7f 45 4c 46
,应读为 4c 46 45 7f
,对应ASCII码 ELF.
,表示这是一个ELF对象。第二部分:占一个字节。02
表示是一个64位对象。
第三部分:占一个字节。01
表示是小端表示法。第四部分:占一个字节。01
表示文件头版本。
第二行中的第三、四个字节为0x003e 表示是x86-64的处理器。后四个字节0x00000001,表示的是当前版本。后八个字节表示程序的入口点,当前为0.
第三行的前八个字节表示程序头表,当前为0.后八个字节为段表的偏移地址:0x00000000000003f0.
第四行中,第七、八个字节表示段头大小为64字节(40H),第九、十字节表示段表的入口有13(0x000d)个。最后两个字节是表示段名串表(符号表)在段表中的索引号为10.
段表的分析:
32位系统的段表定义每个段头大小是28H字节,而64位系统则变成了64字节(40H)。
40H*13=340H,ELF文件头数据结构存储在位偏移为0x0000000000000000-0x0000000000000039之间,而段表存储在0x00000000000003f0-0x0000000000000340之间。
符号表的分析:
32位系统的符号表结构体大小是16字节,而64位系统符号表结构体的大小为22个字节。
由图可知,一共15 个段表。
text.section 起始位置、大小如图所示。
text.section是可执行指令的集合,offset=0x00000040,size =74H.
data.section是初始化后数据的集合,offset=0x000000b4,size=4H.
symtab.section是存放所有section名字的集合。offset=0x00000140,size=150H.
strtab.section是存放所有符号的名字的集合。offset=0x00000290,size=1eH.