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

 示例:所有節反彙編 + 儘可能反彙編出源代碼

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