资源描述:
《linux环境下c语言编译、运行的底层工作原理(3)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Linux环境下C语言编译、运行的底层工作原理(3)借助readelf工具和hexdump工具查看目标文件的详细内容图1linux环境下源代码、汇编代码、目标文件和可执行文件之间的关系图1反应的是linux环境下源代码(.c)、汇编代码(.s)、目标文件(.o)和可执行文件(.out)之间的关系。本文中,我们将要借助readelf工具和hexdump工具来查看目标文件的详细内容,因此要通过gcc-c命令生成print_address.o目标文件。由以上信息不难发现:1.ELFHeader的起始文件地址是0,大小是64Bytes。由于文件开头第
2、一字节的地址定义为0,因此ELFHeader的文件地址范围是0x00~0x3f。2.SectionHeaderTable在文件中的起始位置是752,SectionHeaderTable中有13个表项,每个表项占64bytes,13个表项共占832bytes(832=0x340)。因此SectionHeaderTable对应的文件地址范围是0x2f0~0x62f。将上面截取的13个表项相关信息进行整理,注意Offset项对应起始文件地址,Size也就是section的size。整理后可以得到表1:表1各个section及其对应的文件地址范围Se
3、ction或Header文件地址范围SizeELFHeader0x00~0x3f0x40.text0x40~0x12b0xec.data0x12c0.bss0x12c~0x1330x08.rodata0x12c~0x1e50xba.en_frame0x1e8~0x25f0x78.comment0x260~0x28d0x2e.note.GNU-stack0x28e0.shstrtab0x28e~0x2ee0x61SectionHeaderTable0x2f0~0x62f0x340.symtab0x630~0x7c70x198.strtab0x7
4、c8~0x8370x70.rela.text0x838~0xabf0x288.rela.en_frame0xac0~0xb070x48表1中有几个相邻的section之间首位地址不衔接。例如.rodata的尾地址是0x1e5,但临近的下一个section即.en_frame这个section的首地址并不是预期的0x1e6而是0x1e8。这里要看表项中的最后一个Align,有点类似内存对其的概念。.en_frame的Align值是8,这个section对应的地址必须是8的整数倍。因此.en_frame的起始文件地址是0x1e8而不是0x1e6。
5、接下来我们用hexdump工具查看目标文件(.o)的具体内容。ELFHeader,可以与readelf工具反馈的ELFHeader信息对照着看。[lirenjie@localhost~]$hexdump-Cprint_address.o000000007f454c46020101000000000000000000
6、.ELF............
7、0000001001003e00010000000000000000000000
8、..>.............
9、000000200000000000000000f002000000000000
10、
11、................
12、000000300000000040000000000040000d000a00
13、....@.....@.....
14、00000040554889e54883ec10488d75fcbf000000
15、UH..H...H.u.....
16、0000005000b800000000e800000000be00000000
17、................
18、00000060bf00000000b800000000e800000000c9
19、................
20、00000070c3554889e54883ec
21、10488d75fcbf0000
22、.UH..H...H.u....
23、000000800000b800000000e800000000c9c35548
24、..............UH
25、0000009089e54883ec10be00000000bf00000000
26、..H.............
27、000000a0b800000000e800000000be00000000bf
28、................
29、000000b000000000b800000000e800000000be00
30、................
31、.text000
32、000c0000000bf00000000b800000000e80000
33、................
34、000000d00000be00000000bf000