- 註冊時間
- 2006-10-8
- 最後登錄
- 2019-6-20
- 主題
- 查看
- 積分
- 1306
- 閱讀權限
- 110
- 文章
- 1393
- 相冊
- 0
- 日誌
- 1
狀態︰
離線
|
GNU 的目的檔工具可分為觀察工具 (像是 objdump、nm、strings) 與修改工具 (像是 objcopy、strip) 等兩類。系統程式設計師通常會用 objdump 觀察目的檔,然後利用 objcopy 轉換目的檔。
在觀察工具中,objdump 可以用來傾印目的檔,而 nm可以觀察符號表,strings 可以觀察字串表。nm 與 strings 的用法已在前一節中示範過,在此不再重覆。此處我們將示範objdump工具的用法。
Objdump 是GNU主要的目的檔觀察工具,附錄C中有其詳細的用法,請讀者先閱讀後再回到此處繼續閱讀。
Objdump除了觀察目的檔之外,還可以用來反組譯目的檔,並輸出組合語言,例如,若我們使用指令objdump -d StackFunc.o指令對目的檔 StackFunc.o反組譯動作,其結果將如下列範例所示。
範例:使用 objdump 反組譯目的檔
指令:objdump -d StackFunc.o
StackFunc.o: file format pe-i386
Disassembly of section .text:
00000000 <_push>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 18 sub $0x18,%esp
6: 83 3d 00 00 00 00 63 cmpl $0x63,0x0
d: 7e 1c jle 2b <_push+0x2b>
f: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp)
16: 00
17: c7 44 24 04 05 00 00 movl $0x5,0x4(%esp)
1e: 00
1f: c7 04 24 11 00 00 00 movl $0x11,(%esp)
26: e8 00 00 00 00 call 2b <_push+0x2b>
2b: a1 00 00 00 00 mov 0x0,%eax
30: 89 c2 mov %eax,%edx
32: 8b 45 08 mov 0x8(%ebp),%eax
35: 89 04 95 00 00 00 00 mov %eax,0x0(,%edx,4)
3c: ff 05 00 00 00 00 incl 0x0
42: c9 leave
43: c3 ret
00000044 <_pop>:
44: 55 push %ebp
45: 89 e5 mov %esp,%ebp
47: 83 ec 18 sub $0x18,%esp
4a: 83 3d 00 00 00 00 00 cmpl $0x0,0x0
51: 7f 1c jg 6f <_pop+0x2b>
53: c7 44 24 08 1d 00 00 movl $0x1d,0x8(%esp)
5a: 00
5b: c7 44 24 04 0a 00 00 movl $0xa,0x4(%esp)
62: 00
63: c7 04 24 11 00 00 00 movl $0x11,(%esp)
6a: e8 00 00 00 00 call 6f <_pop+0x2b>
6f: ff 0d 00 00 00 00 decl 0x0
75: a1 00 00 00 00 mov 0x0,%eax
7a: 8b 04 85 00 00 00 00 mov 0x0(,%eax,4),%eax
81: c9 leave
82: c3 ret
83: 90 nop
當然,您也可以用 objdump 觀察目的檔的表頭與內容,您可以用 –x 參數顯示詳細的目的檔資訊,以下範例顯示了 objdump –x StackFunc.o 的執行結果。
範例:使用 objdump 觀察目的檔
指令:objdump -x StackFunc.o
StackFunc.o: file format pe-i386
StackFunc.o
architecture: i386, flags 0x00000039:
HAS_RELOC, HAS_DEBUG, HAS_SYMS, HAS_LOCALS
start address 0x00000000
…
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000084 00000000 00000000 000000b4 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .data 00000000 00000000 00000000 00000000 2**2
ALLOC, LOAD, DATA
2 .bss 00000000 00000000 00000000 00000000 2**2
ALLOC
3 .rdata 00000028 00000000 00000000 00000138 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
SYMBOL TABLE:
[ 0](sec -2)(fl 0x00)(ty 0)(scl 103) (nx 1) 0x00000000 StackFunc.c
File
[ 2](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 1) 0x00000000 _push
AUX tagndx 0 ttlsiz 0x0 lnnos 0 next 0
[ 4](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000044 _pop
[ 5](sec 1)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .text
AUX scnlen 0x83 nreloc 14 nlnno 0
[ 7](sec 2)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .data
AUX scnlen 0x0 nreloc 0 nlnno 0
[ 9](sec 3)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .bss
AUX scnlen 0x0 nreloc 0 nlnno 0
[ 11](sec 4)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .rdata
AUX scnlen 0x25 nreloc 0 nlnno 0
[ 13](sec 0)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 _top
[ 14](sec 0)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 _stack
[ 15](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 ___assert
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
00000008 dir32 _top
00000013 dir32 .rdata
00000022 dir32 .rdata
00000027 DISP32 ___assert
0000002c dir32 _top
00000038 dir32 _stack
0000003e dir32 _top
0000004c dir32 _top
00000057 dir32 .rdata
00000066 dir32 .rdata
0000006b DISP32 ___assert
00000071 dir32 _top
00000076 dir32 _top
0000007d dir32 _stack
從上述範例的傾印結果中,我們可以看到StackFunc.o 目的檔的『SYMBOL TABLE』 段落中中含有 _push, _pop, .text, .data, .bss, .rdata, _top, _stack, ___assert 等符號,而這些符號的修正記錄在 『RELOCATION RECORDS FOR [.text]』段落中,仔細閱讀就會知道哪些記憶體位址需要修正(也就是包含修改記錄M<位址><修改值>)。 |
|