資源描述:
《linux環(huán)境下c語(yǔ)言編譯、運(yùn)行的底層工作原理》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、Linux環(huán)境下C語(yǔ)言編譯、運(yùn)行的底層工作原理(3)借助readelf工具和hexdump工具查看目標(biāo)文件的詳細(xì)內(nèi)容圖1linux環(huán)境下源代碼、匯編代碼、目標(biāo)文件和可執(zhí)行文件之間的關(guān)系圖1反應(yīng)的是linux環(huán)境下源代碼(.c)、匯編代碼(.s)、目標(biāo)文件(.o)和可執(zhí)行文件(.out)之間的關(guān)系。本文中,我們將要借助readelf工具和hexdump工具來(lái)查看目標(biāo)文件的詳細(xì)內(nèi)容,因此要通過(guò)gcc-c命令生成print_address.o目標(biāo)文件。由以上信息不難發(fā)現(xiàn):1.ELFHeader的起始文件地址是0,大小是64Bytes。由于文件開(kāi)頭第一字節(jié)的地址定義為0,因此EL
2、FHeader的文件地址范圍是0x00~0x3f。2.SectionHeaderTable在文件中的起始位置是752,SectionHeaderTable中有13個(gè)表項(xiàng),每個(gè)表項(xiàng)占64bytes,13個(gè)表項(xiàng)共占832bytes(832=0x340)。因此SectionHeaderTable對(duì)應(yīng)的文件地址范圍是0x2f0~0x62f。將上面截取的13個(gè)表項(xiàng)相關(guān)信息進(jìn)行整理,注意Offset項(xiàng)對(duì)應(yīng)起始文件地址,Size也就是section的size。整理后可以得到表1:表1各個(gè)section及其對(duì)應(yīng)的文件地址范圍Section或Header文件地址范圍SizeELFHeade
3、r0x00~0x3f0x40.text0x40~0x12b0xec.data0x12c0.bss0x12c~0x1330x08.rodata0x12c~0x1e50xba.en_frame0x1e8~0x25f0x78.comment0x260~0x28d0x2e.note.GNU-stack0x28e0.shstrtab0x28e~0x2ee0x61SectionHeaderTable0x2f0~0x62f0x340.symtab0x630~0x7c70x198.strtab0x7c8~0x8370x70.rela.text0x838~0xabf0x288.rela.e
4、n_frame0xac0~0xb070x48表1中有幾個(gè)相鄰的section之間首位地址不銜接。例如.rodata的尾地址是0x1e5,但臨近的下一個(gè)section即.en_frame這個(gè)section的首地址并不是預(yù)期的0x1e6而是0x1e8。這里要看表項(xiàng)中的最后一個(gè)Align,有點(diǎn)類似內(nèi)存對(duì)其的概念。.en_frame的Align值是8,這個(gè)section對(duì)應(yīng)的地址必須是8的整數(shù)倍。因此.en_frame的起始文件地址是0x1e8而不是0x1e6。接下來(lái)我們用hexdump工具查看目標(biāo)文件(.o)的具體內(nèi)容。ELFHeader,可以與readelf工具反饋的ELFH
5、eader信息對(duì)照著看。[lirenjie@localhost~]$hexdump-Cprint_address.o000000007f454c46020101000000000000000000
6、.ELF............
7、0000001001003e00010000000000000000000000
8、..>.............
9、000000200000000000000000f002000000000000
10、................
11、000000300000000040000000000040000d000a00
12、....@.....@.....
13、
14、00000040554889e54883ec10488d75fcbf000000
15、UH..H...H.u.....
16、0000005000b800000000e800000000be00000000
17、................
18、00000060bf00000000b800000000e800000000c9
19、................
20、00000070c3554889e54883ec10488d75fcbf0000
21、.UH..H...H.u....
22、000000800000b800000000e800000000c9c35548
23、..............U
24、H
25、0000009089e54883ec10be00000000bf00000000
26、..H.............
27、000000a0b800000000e800000000be00000000bf
28、................
29、000000b000000000b800000000e800000000be00
30、................
31、.text000000c0000000bf00000000b800000000e80000
32、................
33、000000d00000be00000000bf000