1. 程式人生 > >objdump命令解析

objdump命令解析

objdump

objdump命令是Linux下的反彙編目標檔案或者可執行檔案的命令,它以一種可閱讀的格式讓你更多地瞭解二進位制檔案可能帶有的附加資訊。

 

引數選項:

--archive-headers 
-a 
顯示檔案庫的成員資訊,類似ls -l將lib*.a的資訊列出。 

-b bfdname 
--target=bfdname 
指定目標碼格式。這不是必須的,objdump能自動識別許多格式,比如: 

objdump -b oasys -m vax -h fu.o 
顯示fu.o的頭部摘要資訊,明確指出該檔案是Vax系統下用Oasys編譯器生成的目標檔案。objdump -i將給出這裡可以指定的目標碼格式列表。 

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

--debugging 
-g 
顯示除錯資訊。企圖解析儲存在檔案中的除錯資訊並以C語言的語法顯示出來。僅僅支援某些型別的除錯資訊。有些其他的格式被
readelf
-w支援。 -e --debugging-tags 類似-g選項,但是生成的資訊是和ctags工具相相容的格式。 --disassemble -d 從objfile中反彙編那些特定指令機器碼的section。 -D --disassemble-all 與 -d 類似,但反彙編所有section. --prefix-addresses 反彙編的時候,顯示每一行的完整地址。這是一種比較老的反彙編格式。 -EB -EL --endian={big|little} 指定目標檔案的小端。這個項將影響反彙編出來的指令。在反彙編的檔案沒描述小端資訊的時候用。例如S-records. -f --
file
-headers 顯示objfile中每個檔案的整體頭部摘要資訊。 -h --section-headers --headers 顯示目標檔案各個section的頭部摘要資訊。 -H --help 簡短的幫助資訊。 -i --info 顯示對於 -b 或者 -m 選項可用的架構和目標格式列表。 -j name --section=name 僅僅顯示指定名稱為name的section的資訊 -l --line-numbers 用檔名和行號標註相應的目的碼,僅僅和-d、-D或者-r一起使用使用-ld和使用-d的區別不是很大,在原始碼級除錯的時候有用,要求編譯時使用了-g之類的除錯編譯選項。 -m machine --architecture=machine 指定反彙編目標檔案時使用的架構,當待反彙編檔案本身沒描述架構資訊的時候(比如S-records),這個選項很有用。可以用-i選項列出這裡能夠指定的架構. --reloc -r 顯示檔案的重定位入口。如果和-d或者-D一起使用,重定位部分以反彙編後的格式顯示出來。 --dynamic-reloc -R 顯示檔案的動態重定位入口,僅僅對於動態目標檔案意義,比如某些共享庫。 -s --full-contents 顯示指定section的完整內容。預設所有的非空section都會被顯示。 -S --source 儘可能反彙編出原始碼,尤其當編譯的時候指定了-g這種除錯引數時,效果比較明顯。隱含了-d引數。 --show-raw-insn 反彙編的時候,顯示每條彙編指令對應的機器碼,如不指定--prefix-addresses,這將是預設選項。 --no-show-raw-insn 反彙編時,不顯示彙編指令的機器碼,如不指定--prefix-addresses,這將是預設選項。 --start-address=address 從指定地址開始顯示資料,該選項影響-d、-r和-s選項的輸出。 --stop-address=address 顯示資料直到指定地址為止,該項影響-d、-r和-s選項的輸出。 -t --syms 顯示檔案的符號表入口。類似於
nm
-s提供的資訊 -T --dynamic-syms 顯示檔案的動態符號表入口,僅僅對動態目標檔案意義,比如某些共享庫。它顯示的資訊類似於 nm -D|--dynamic 顯示的資訊。 -V --version 版本資訊 --all-headers -x 顯示所可用的頭資訊,包括符號表、重定位入口。-x 等價於-a -f -h -r -t 同時指定。 -z --disassemble-zeroes 一般反彙編輸出將省略大塊的零,該選項使得這些零塊也被反彙編。 @file 可以將選項集中到一個檔案中,然後使用這個@file選項載入。

 

關於符號表欄位下面直接只介紹部分常用的:

  • .text:已編譯程式的機器程式碼。
  • .rodata:只讀資料,比如printf語句中的格式串和開關(switch)語句的跳轉表。
  • .data:已初始化的全域性C變數。區域性C變數在執行時被儲存在棧中,既不出現在.data中,也不出現在.bss節中。
  • .bss:未初始化的全域性C變數。在目標檔案中這個節不佔據實際的空間,它僅僅是一個佔位符。目標檔案格式區分初始化未初始化變數是為了空間效率在:在目標檔案中,未初始化變數不需要佔據任何實際的磁碟空間。
  • .symtab:一個符號表(symbol table),它存放在程式中被定義和引用的函式和全域性變數的資訊。一些程式設計師錯誤地認為必須通過-g選項來編譯一個程式,得到符號表資訊。實際上,每個可重定位目標檔案在.symtab中都有一張符號表。然而,和編譯器中的符號表不同,.symtab符號表不包含區域性變數的表目。
  • .rel.text:當連結噐把這個目標檔案和其他檔案結合時,.text節中的許多位置都需要修改。一般而言,任何呼叫外部函式或者引用全域性變數的指令都需要修改。另一方面呼叫本地函式的指令則不需要修改。注意,可執行目標檔案中並不需要重定位資訊,因此通常省略,除非使用者顯式地指示連結器包含這些資訊。
  • .rel.data:被模組定義或引用的任何全域性變數的資訊。一般而言,任何已初始化全域性變數的初始值是全域性變數或者外部定義函式的地址都需要被修改。
  • .debug:一個除錯符號表,其有些表目是程式中定義的區域性變數和型別定義,有些表目是程式中定義和引用的全域性變數,有些是原始的C原始檔。只有以-g選項呼叫編譯驅動程式時,才會得到這張表。
  • .line:原始C源程式中的行號和.text節中機器指令之間的對映。只有以-g選項呼叫編譯驅動程式時,才會得到這張表。
  • .strtab:一個字串表,其內容包括.symtab和.debug節中的符號表,以及節頭部中的節名字。字串表就是以null結尾的字串序列。

使用舉例:

反彙編應用程式

objdump -d  main.o  

顯示檔案頭資訊 

objdump -f main.o

顯示制定section段資訊(comment段)

objdump -s -j .comment main.o