objdump 使用指南

 

objdump -j .text -S wbxtahoeas.2.8.2-40 > tahoe2.8.2-40.txt

 

---------------objdump是用查看目標文件或者可執行的目標文件的構成的GCC工具----------

  以下3條命令足夠那些喜歡探索目標文件與源代碼之間的絲絲的關係的朋友。

  objdump -x obj 以某種分類信息的形式把目標文件的數據組織(被分爲幾大塊)輸出 <可查到該文件的所有動態庫>

  objdump -t obj 輸出目標文件的符號表()

  objdump -h obj 輸出目標文件的所有段概括()

  objdump -j .text/.data -S obj 輸出指定段的信息,大概就是反彙編源代碼把

  objdump -S obj C語言與彙編語言同時顯示

  以下爲網上摘錄文章。

  關於nm -s的顯示請自己man nm查看

  objdump命令的man手冊

  objdump - 顯示二進制文件信息

  objdump

  [-a] [-b bfdname |

  --target=bfdname] [-C] [--debugging]

  [-d] [-D]

  [--disassemble-zeroes]

  [-EB|-EL|--endian={big|little}] [-f]

  [-h] [-i|--info]

  [-j section | --section=section]

  [-l] [-m machine ] [--prefix-addresses]

  [-r] [-R]

  [-s|--full-contents] [-S|--source]

  [--[no-]show-raw-insn] [--stabs] [-t]

  [-T] [-x]

  [--start-address=address] [--stop-address=address]

  [--adjust-vma=offset] [--version] [--help]

  objfile...

  --archive-headers

  -a 顯示檔案庫的成員信息,與 ar tv 類似

  objdump -a libpcap.a

  和 ar -tv libpcap.a 顯示結果比較比較顯然這個選項沒有什麼意思。

  --adjust-vma=offset

  When dumping information, first add offset to all

  the section addresses. This is useful if the sec-

  tion addresses do not correspond to the symbol

  table, which can happen when putting sections at

  particular addresses when using a format which can

  not represent section addresses, such as a.out.

  -b bfdname

  --target=bfdname

  指定目標碼格式。這不是必須的,objdump能自動識別許多格式,比如:objdump -b oasys -m vax -h fu.o

  顯示fu.o的頭部摘要信息,明確指出該文件是Vax系統下用Oasys編譯器生成的目標文件。objdump -i將給出這裏可以指定的目標碼格式列表

  --demangle

  -C 將底層的符號名解碼成用戶級名字,除了去掉所有開頭的下劃線之外,還使得C++函數名以可理解的方式顯示出來。

  --debugging

  顯示調試信息。企圖解析保存在文件中的調試信息並以C語言的語法顯示出來。僅僅支持某些類型的調試信息。

  --disassemble

  -d 反彙編那些應該還有指令機器碼的section

  --disassemble-all

  -D 與 -d 類似,但反彙編所有section

  --prefix-addresses

  反彙編的時候,顯示每一行的完整地址。這是一種比較老的反彙編格式。

  顯示效果並不理想,但可能會用到其中的某些顯示,自己可以對比。

  --disassemble-zeroes

  一般反彙編輸出將省略大塊的零,該選項使得這些零塊也被反彙編。

  -EB

  -EL

  --endian={big|little}

  這個選項將影響反彙編出來的指令。

  little-endian就是我們當年在dos下玩彙編的時候常說的高位在高地址,x86都是這種。

  --file-headers

  -f 顯示objfile中每個文件的整體頭部摘要信息。

  --section-headers

  --headers

  -h 顯示目標文件各個section的頭部摘要信息。

  --help 簡短的幫助信息。

  --info

  -i 顯示對於 -b 或者 -m 選項可用的架構和目標格式列表。

  --section=name

  -j name 僅僅顯示指定section的信息

  --line-numbers

  -l 用文件名和行號標註相應的目標代碼,僅僅和-d、-D或者-r一起使用使用-ld和使用-d的區別不是很大,在源碼級調試的時候有用,要求編譯時使用了-g之類的調試編譯選項。

 

 

 

--architecture=machine

  -m machine

  指定反彙編目標文件時使用的架構,當待反彙編文件本身沒有描述架構信息的時候(比如S-records),這個選項很有用。可以用-i選項列出這裏能夠指定的架構

  --reloc

  -r 顯示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反彙編後的格式顯示出來。

  --dynamic-reloc

  -R 顯示文件的動態重定位入口,僅僅對於動態目標文件有意義,比如某些共享庫。

  --full-contents

  -s 顯示指定section的完整內容。

  objdump --section=.text -s inet.o | more

  --source

  -S 儘可能反彙編出源代碼,尤其當編譯的時候指定了-g這種調試參數時,效果比較明顯。隱含了-d參數。

  --show-raw-insn

  反彙編的時候,顯示每條彙編指令對應的機器碼,除非指定了

  --prefix-addresses,這將是缺省選項。

  --no-show-raw-insn

  反彙編時,不顯示彙編指令的機器碼,這是指定 --prefix-addresses

  選項時的缺省設置。

  --stabs

  Display the contents of the .stab, .stab.index, and

  .stab.excl sections from an ELF file. This is only

  useful on systems (such as Solaris 2.0) in which

  .stab debugging symbol-table entries are carried in

  an ELF section. In most other file formats, debug-

  ging symbol-table entries are interleaved with

  linkage symbols, and are visible in the --syms output.

  --start-address=address

  從指定地址開始顯示數據,該選項影響-d、-r和-s選項的輸出。

  --stop-address=address

  顯示數據直到指定地址爲止,該選項影響-d、-r和-s選項的輸出。

  --syms

  -t 顯示文件的符號表入口。類似於nm -s提供的信息

  --dynamic-syms

  -T 顯示文件的動態符號表入口,僅僅對動態目標文件有意義,比如某些共享庫。它顯示的信息類似於 nm -D|--dynamic 顯示的信息。

  --version 版本信息

  objdump --version

  --all-headers

  -x 顯示所有可用的頭信息,包括符號表、重定位入口。-x 等價於

  -a -f -h -r -t 同時指定。

  objdump -x inet.o

  參看 nm(1)

  ★ objdump應用舉例(待增加)

  /*

  g++ -g -Wstrict-prototypes -Wall -Wunused -o objtest objtest.c

  */

  #include

  #include

  int main ( int argc, char * argv[] )

  {

  execl( "/bin/sh", "/bin/sh", "-i", 0 );

  return 0;

  }

  g++ -g -Wstrict-prototypes -Wall -Wunused -o objtest objtest.c

  objdump -j .text -Sl objtest | more

  /main(查找)

  08048750:

  main():

  /home/scz/src/objtest.c:7

  */

  #include

  #include

  int main ( int argc, char * argv[] )

  {

  8048750:       55                      pushl %ebp

  8048751:       89 e5                   movl   %esp,%ebp

  /home/scz/src/objtest.c:8

  execl( "/bin/sh", "/bin/sh", "-i", 0 );

  8048753:       6a 00                   pushl $0x0

  8048755:       68 d0 87 04 08          pushl $0x80487d0

  804875a:       68 d3 87 04 08          pushl $0x80487d3

  804875f:       68 d3 87 04 08          pushl $0x80487d3

  8048764:       e8 db fe ff ff          call   8048644 <_init+0x40>

  8048769:       83 c4 10                addl   $0x10,%esp

  /home/scz/src/objtest.c:9

  return 0;

  804876c:       31 c0                   xorl   %eax,%eax

  804876e:       eb 04                   jmp    8048774

  8048770:       31 c0                   xorl   %eax,%eax

  8048772:       eb 00                   jmp    8048774

  /home/scz/src/objtest.c:10

  }

  8048774:       c9                      leave

  8048775:       c3                      ret

  8048776:       90                      nop

  如果說上面還不夠清楚,可以用下面的命令輔助一下:

  objdump -j .text -Sl objtest --prefix-addresses | more

  objdump -j .text -Dl objtest | more

  用以上不同的命令去試會得到驚喜!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章