gcc指令objdump用法2009年03月29日 星期日 23:49gcc指令之 objdump
---------------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應用舉例(待增加)
#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
用以上不同的指令去試會得到驚喜!
轉自:http://hi.baidu.com/sbuxmmm_2007/blog/item/35d07c251e39146834a80f24.html