#8: loader v0.5 與結果輸出(改善與小討論)
时间:2009-04-10 来源:AppleDragon
jollen 發表於 December 6, 2006 1:12 AM
我們接續 loader v0.4 的工作,強化一下輸出結果的可讀性;先來比較一下 loader v0.4 與 loader v0.5 的輸出畫面。
$ ./loader-0.4 loader-0.4 | $ ./loader-0.5 loader-0.4 |
ELF Identification |
ELF Identification |
Cool!做出了 'objdump -x' 的部份功能。頗為有趣,那麼用 objdump 來互相比較一下看看。
loader v0.5 v.s. objdump v.s. readelf
$ objdump -x loader-0.4(只擷取 section 輸出結果) | $ ./loader-0.5 loader-0.4 |
Sections: |
ELF Identification |
不過事情好像有點怪異,我們的 loader v0.5 怎麼在最後多出 3 個 section 呢?被附身了。
不過,原來是 objdump 不會把最後這 3 個 section 印出來啦,這 3 個 section 分別是:
1) .shstrtab:section header straing table
2) .symtab:symbol table
3) .strtab:string table
哇塞!原來 symbol table 藏在這裡啊。但是,如果我們改用 readelf 來讀 ELF,就可以看到完整的 ELF headers 了,而且輸出的畫面也比較具可讀性:
$ readelf -S loader-0.4
There are 34 section headers, starting at offset 0x22e4:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 080480f4 0000f4 000013 00 A 0 0 1
[ 2] .note.ABI-tag NOTE 08048108 000108 000020 00 A 0 0 4
[ 3] .hash HASH 08048128 000128 000038 04 A 4 0 4
[ 4] .dynsym DYNSYM 08048160 000160 000090 10 A 5 1 4
[ 5] .dynstr STRTAB 080481f0 0001f0 000062 00 A 0 0 1
[ 6] .gnu.version VERSYM 08048252 000252 000012 02 A 4 0 2
[ 7] .gnu.version_r VERNEED 08048264 000264 000020 00 A 5 1 4
[ 8] .rel.dyn REL 08048284 000284 000008 08 A 4 0 4
[ 9] .rel.plt REL 0804828c 00028c 000030 08 A 4 b 4
[10] .init PROGBITS 080482bc 0002bc 000017 00 AX 0 0 4
[11] .plt PROGBITS 080482d4 0002d4 000070 04 AX 0 0 4
[12] .text PROGBITS 08048344 000344 00050c 00 AX 0 0 4
[13] .fini PROGBITS 08048850 000850 00001b 00 AX 0 0 4
[14] .rodata PROGBITS 0804886c 00086c 00015c 00 A 0 0 4
[15] .eh_frame PROGBITS 080489c8 0009c8 000004 00 A 0 0 4
[16] .data PROGBITS 080499cc 0009cc 00000c 00 WA 0 0 4
[17] .dynamic DYNAMIC 080499d8 0009d8 0000c8 08 WA 5 0 4
[18] .ctors PROGBITS 08049aa0 000aa0 000008 00 WA 0 0 4
[19] .dtors PROGBITS 08049aa8 000aa8 000008 00 WA 0 0 4
[20] .jcr PROGBITS 08049ab0 000ab0 000004 00 WA 0 0 4
[21] .got PROGBITS 08049ab4 000ab4 000028 04 WA 0 0 4
[22] .bss NOBITS 08049adc 000adc 000004 00 WA 0 0 4
[23] .comment PROGBITS 00000000 000adc 000132 00 0 0 1
[24] .debug_aranges PROGBITS 00000000 000c10 000078 00 0 0 8
[25] .debug_pubnames PROGBITS 00000000 000c88 000025 00 0 0 1
[26] .debug_info PROGBITS 00000000 000cad 000a84 00 0 0 1
[27] .debug_abbrev PROGBITS 00000000 001731 000138 00 0 0 1
[28] .debug_line PROGBITS 00000000 001869 00027c 00 0 0 1
[29] .debug_frame PROGBITS 00000000 001ae8 000014 00 0 0 4
[30] .debug_str PROGBITS 00000000 001afc 0006ba 01 MS 0 0 1
[31] .shstrtab STRTAB 00000000 0021b6 00012b 00 0 0 1
[32] .symtab SYMTAB 00000000 002834 000740 10 33 54 4
[33] .strtab STRTAB 00000000 002f74 00046c 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
原來這是工具的問題。嗯!好吧,以後都改用 readelf 來玩吧。
Index 0: undefined
還有一點就是,ELF headers index 0 在 SysV ABI 裡的定義是「undefined」,readelf 把它輸出成 NULL,我們的範例跟 objdump 一樣,直接跳過!
readelf 輸出的其它 column 分述如下。
Type
「type」欄位的話就是在「ELF(Executable and Linking Format)格式教學文件, #7: 讀 ELF 的 Section Name(透過 strtab)」裡介紹到的 sh_type。
Addr
這個好玩,不過目前先跳過。(>_<)
Off、Size
跟我們的 loader v0.5 輸出結果一樣,分別代表 section 在 ELF object 裡的 file offset 與其大小(bytes)。readelf 是用十六進位輸出,我們的範例是用十進位輸出。
範例程式一樣可以由「http://tw.jollen.org/elf-programming/」下載。
Also See |
|
--jollen