SOGO論壇
  登入   註冊   找回密碼
查看: 615|回覆: 0
列印 上一主題 下一主題

[技術文章] 目的檔觀察工具 - objdump [複製連結]

Rank: 11Rank: 11Rank: 11Rank: 11

熱心參予論壇活動及用心回覆主題勳章 數位硬體勳章

狀態︰ 離線
跳轉到指定樓層
1
發表於 2012-7-10 10:10:46 |只看該作者 |倒序瀏覽
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<位址><修改值>)。
喜歡嗎?分享這篇文章給親朋好友︰
               感謝作者     

請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2025-2-6 15:55

© 2004-2025 SOGO論壇 OURSOGO.COM
回頂部