1.功能簡(jiǎn)介
objdump 命令是 GNU Binutils 二進(jìn)制工具集的一員,用于查看目標(biāo)文件或可執(zhí)行文件的組成信息,以可讀的形式打印二進(jìn)制文件的內(nèi)容。
2.命令格式
objdump[OPTIONS]OBJFILES
3.選項(xiàng)說(shuō)明
-a,--archive-headers
顯示檔案頭信息,展示檔案每一個(gè)成員的文件格式。效果等同于命令 ar -tv
-b,--target=BFDNAME
指定目標(biāo)碼格式。這不是必須的,objdump 能自動(dòng)識(shí)別許多格式,比如 objdump -b oasys -m vax -h fu.o 顯示 fu.o 的頭部摘要信息,明確指出該文件是 Vax 系統(tǒng)下用 Oasys 編譯器生成的目標(biāo)文件。objdump -i 將給出這里可以指定的目標(biāo)碼格式列表
-C,--demangle[=STYLE]
目標(biāo)文件中的符號(hào)解碼成用戶級(jí)名稱。比如移除符號(hào)修飾時(shí)在變量與函數(shù)名前添加的下劃線等。
-d,--disassemble
反匯編目標(biāo)文件,將機(jī)器指令反匯編成匯編代碼
-D,--disassemble-all
與-d類(lèi)似,但反匯編所有段(section)
-z,--disassemble-zeroes
一般反匯編輸出將省略零塊,該選項(xiàng)使得這些零塊也被反匯編
-EB,-EL,--endian={big|little}
指定目標(biāo)文件的字節(jié)序,在目標(biāo)文件沒(méi)描述字節(jié)序時(shí)很有用,例如 S-records。這個(gè)選項(xiàng)只影響反匯編
-f,--file-headers
顯示每一個(gè)目標(biāo)文件的頭信息
-F,--file-offsets
反匯編時(shí),打印每一個(gè)符號(hào)的偏移地址
--file-start-context
顯示源碼/匯編代碼(假設(shè)為-S)時(shí),將上下文擴(kuò)展到文件的開(kāi)頭
-g,--debugging
顯示調(diào)試信息。企圖解析保存在文件中的調(diào)試信息并以 C 語(yǔ)言的語(yǔ)法顯示出來(lái)。僅僅支持某些類(lèi)型的調(diào)試信息。有些其他的格式被readelf -w支持
-e,--debugging-tags
類(lèi)似-g選項(xiàng),但是生成的信息是和ctags工具相兼容的格式
-h,--section-headers,--headers
顯示目標(biāo)文件各個(gè)section的頭部摘要信息
-i,--info
顯示對(duì)于-b或者-m選項(xiàng)可用的架構(gòu)和目標(biāo)格式列表
-j,--section=NAME
僅顯示指定名稱的section的信息
-l,--line-numbers
用文件名和行號(hào)標(biāo)注相應(yīng)的目標(biāo)代碼,僅僅和-d、-D或者-r一起使用
-S,--source
反匯編時(shí)盡可能使用源代碼表示。隱含了-d參數(shù)
-m,--architecture=MACHINE
指定反匯編目標(biāo)文件時(shí)使用的架構(gòu),當(dāng)待反匯編文件本身沒(méi)描述架構(gòu)信息的時(shí)候(比如S-records),這個(gè)選項(xiàng)很有用。可以用-i選項(xiàng)列出這里能夠指定的架構(gòu)
-M,--disassembler-options=OPTIONS
給反匯編程序傳遞參數(shù),可以指定多個(gè),使用逗號(hào)分隔
-p,--private-headers
打印目標(biāo)文件格式的特定信息。打印的信息取決于目標(biāo)文件格式,對(duì)于某些目標(biāo)文件格式,不打印任何附加信息。
-P,--private=OPTIONS
打印目標(biāo)文件格式的特定信息。OPTIONS 是一個(gè)逗號(hào)分隔的列表。例如對(duì)于XCOFF,可用的選項(xiàng)有 header, aout, sections, syms, relocs, lineno, loader, except, typchk, traceback and toc
-r,--reloc
顯示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反匯編后的格式顯示出來(lái)
-R,--dynamic-reloc
顯示文件的動(dòng)態(tài)重定位入口,僅僅對(duì)于動(dòng)態(tài)目標(biāo)文件意義,比如某些共享庫(kù)
-s,--full-contents
顯示section的完整內(nèi)容。默認(rèn)所有的非空section都會(huì)被顯示
-W[lLiaprmfFsoRt],--dwarf=[rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index]
顯示文件中調(diào)試段的內(nèi)容,如果存在的話
-G,--stabs
顯示請(qǐng)求的任何 section 的全部?jī)?nèi)容。顯示段 .stab、.stab.index 和 .stab.excl 的內(nèi)容
-t,--syms
顯示文件的符號(hào)表入口。類(lèi)似于nm -s提供的信息
-T,--dynamic-syms
顯示文件的動(dòng)態(tài)符號(hào)表入口,僅僅對(duì)動(dòng)態(tài)目標(biāo)文件意義,比如某些共享庫(kù)。它顯示的信息類(lèi)似于 nm -D,--dynamic 顯示的信息
-x,--all-headers
顯示所可用的頭信息,包括符號(hào)表、重定位入口。-x 等價(jià)于-a -f -h -p -r -t 同時(shí)指定
-w,--wide
為具有超過(guò)80列的輸出設(shè)備格式化某些行。也不要在顯示符號(hào)名稱時(shí)截?cái)喾?hào)名稱
--start-address=ADDRESS
從指定地址開(kāi)始顯示數(shù)據(jù),該選項(xiàng)影響-d、-r和-s選項(xiàng)的輸出
--stop-address=ADDRESS
顯示數(shù)據(jù)直到指定地址為止,該項(xiàng)影響-d、-r和-s選項(xiàng)的輸出
--prefix-addresses
反匯編的時(shí)候,顯示每一行的完整地址。這是一種比較老的反匯編格式
--no-show-raw-insn
反匯編時(shí),不顯示匯編指令的機(jī)器碼。當(dāng)使用--prefix-addresses時(shí),這是缺省選項(xiàng)
--adjust-vma=OFFSET
當(dāng)解析信息時(shí),首先給所有的段添加偏移值offset。當(dāng)段地址與符號(hào)表不符時(shí),這個(gè)選項(xiàng)很有用。比如將段放置到特殊地址,因?yàn)槟硞€(gè)格式無(wú)法表示段地址,比如 a.out
--special-syms
顯示特殊符號(hào)與用戶不關(guān)心的符號(hào)
--prefix=PREFIX
當(dāng)使用-S時(shí),指定前綴添加到絕對(duì)路徑中
--prefix-strip=LEVEL
指定剝離絕對(duì)路徑中多少個(gè)前綴目錄名。此選項(xiàng)只有在使用了選項(xiàng)--prefix=PREFIX 才有效
--insn-width=WIDTH
指定反匯編后的指令輸出的行寬,單位字節(jié)
-V,--version
版本信息
-H,--help
幫助信息
4.常用示例
首先給出后面大部分測(cè)試所基于的源代碼以及編譯指令。涉及兩個(gè) C++ 源文件。
objdump.cpp:
main.cpp:
#include
usingnamespacestd;
voidprint();
intmain()
{
print();
}
使用-g選項(xiàng)加入調(diào)試信息,分別編譯生成目標(biāo)文件objdump.o與main.o。
g++-c-gobjdump.cpp-oobjdump.o
g++-c-gmain.cpp-omain.o
然后通過(guò)ar命令將兩個(gè)目標(biāo)文件打包成靜態(tài)庫(kù)libobjdump.a。
arcrvlibobjdump.amain.oobjdump.o
(1)查看檔案包含的目標(biāo)文件列表。
[root@TENCENT64~]#objdump-alibobjdump.a
Inarchivelibobjdump.a:
main.o:fileformatelf64-x86-64
rw-r--r--0/018696Mar820:252019main.o
objdump.o:fileformatelf64-x86-64
rw-r--r--0/021352Mar820:252019objdump.o
使用命令ar -tv也可以列出檔案中包含的目標(biāo)文件。
[root@TENCENT64~]#ar-tvlibobjdump.a
rw-r--r--0/018696Mar820:252019main.o
rw-r--r--0/021352Mar820:252019objdump.o
(2)顯示目標(biāo)文件objdump.o的代碼段(.text)內(nèi)容。
[root@TENCENT64~]#objdump--section=.text-sobjdump.o
objdump.o:fileformatelf64-x86-64
Contentsofsection.text:
0000554889e5be00000000bf00000000e800UH..............
0010000000be000000004889c7e800000000........H.......
00205dc3554889e54883ec10897dfc8975f8].UH..H....}..u.
0030837dfc017527817df8ffff0000751ebf.}..u'.}.....u..
004000000000e800000000ba00000000be00................
0050000000bf00000000e800000000c9c355...............U
00604889e5beffff0000bf01000000e8b0ffH...............
0070ffff5dc3..].
注意,不能單獨(dú)使用-j或者–section選項(xiàng),一定要加上-s選項(xiàng)。
(3)反匯編objdump.o中的text段內(nèi)容,并盡可能用源代碼形式表示。
[root@TENCENT64~]#objdump--section=.text-Sobjdump.o
objdump.o:fileformatelf64-x86-64
Disassemblyofsection.text:
0000000000000000<_Z5printv>:
#include
voidprint()
{
0:55push%rbp
1:4889e5mov%rsp,%rbp
std::cout<<"objdump"<$0x0,%esi
9:bf00000000mov$0x0,%edi
e:e800000000callq13<_Z5printv+0x13>
13:be00000000mov$0x0,%esi
18:4889c7mov%rax,%rdi
1b:e800000000callq20<_Z5printv+0x20>
}
20:5dpop%rbp
21:c3retq
0000000000000022<_Z41__static_initialization_and_destruction_0ii>:
22:55push%rbp
23:4889e5mov%rsp,%rbp
26:4883ec10sub$0x10,%rsp
2a:897dfcmov%edi,-0x4(%rbp)
2d:8975f8mov%esi,-0x8(%rbp)
30:837dfc01cmpl$0x1,-0x4(%rbp)
34:7527jne5d<_Z41__static_initialization_and_destruction_0ii+0x3b>
36:817df8ffff0000cmpl$0xffff,-0x8(%rbp)
3d:751ejne5d<_Z41__static_initialization_and_destruction_0ii+0x3b>
externwostreamwclog;///Linkedtostandarderror(buffered)
#endif
//@}
//Forconstructionoffilebuffersforcout,cin,cerr,cloget.al.
staticios_base::Init__ioinit;
3f:bf00000000mov$0x0,%edi
44:e800000000callq49<_Z41__static_initialization_and_destruction_0ii+0x27>
49:ba00000000mov$0x0,%edx
4e:be00000000mov$0x0,%esi
53:bf00000000mov$0x0,%edi
58:e800000000callq5d<_Z41__static_initialization_and_destruction_0ii+0x3b>
5d:c9leaveq
5e:c3retq
000000000000005f<_GLOBAL__sub_I__Z5printv>:
5f:55push%rbp
60:4889e5mov%rsp,%rbp
63:beffff0000mov$0xffff,%esi
68:bf01000000mov$0x1,%edi
6d:e8b0ffffffcallq22<_Z41__static_initialization_and_destruction_0ii>
72:5dpop%rbp
73:c3retq
(3)顯示目標(biāo)文件的符號(hào)表入口。
[root@TENCENT64~]#objdump-tobjdump.o
objdump.o:fileformatelf64-x86-64
SYMBOLTABLE:
0000000000000000ldf*ABS*0000000000000000objdump.cpp
0000000000000000ld.text0000000000000000.text
0000000000000000ld.data0000000000000000.data
0000000000000000ld.bss0000000000000000.bss
0000000000000000lO.bss0000000000000001_ZStL8__ioinit
0000000000000000ld.rodata0000000000000000.rodata
0000000000000022lF.text000000000000003d_Z41__static_initialization_and_destruction_0ii
000000000000005flF.text0000000000000015_GLOBAL__sub_I__Z5printv
0000000000000000ld.init_array0000000000000000.init_array
0000000000000000ld.debug_info0000000000000000.debug_info
0000000000000000ld.debug_abbrev0000000000000000.debug_abbrev
0000000000000000ld.debug_aranges0000000000000000.debug_aranges
0000000000000000ld.debug_line0000000000000000.debug_line
0000000000000000ld.debug_str0000000000000000.debug_str
0000000000000000ld.note.GNU-stack0000000000000000.note.GNU-stack
0000000000000000ld.eh_frame0000000000000000.eh_frame
0000000000000000ld.comment0000000000000000.comment
0000000000000000gF.text0000000000000022_Z5printv
0000000000000000*UND*0000000000000000_ZSt4cout
0000000000000000*UND*0000000000000000_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
0000000000000000*UND*0000000000000000_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
0000000000000000*UND*0000000000000000_ZNSolsEPFRSoS_E
0000000000000000*UND*0000000000000000_ZNSt8ios_base4InitC1Ev
0000000000000000*UND*0000000000000000.hidden__dso_handle
0000000000000000*UND*0000000000000000_ZNSt8ios_base4InitD1Ev
0000000000000000*UND*0000000000000000__cxa_atexit
這里,輸出的信息類(lèi)似nm -s命令的輸出,相比較之下,nm命令的輸出如下:
[root@TENCENT64~]#nm-sobjdump.o
U__cxa_atexit
U__dso_handle
000000000000005ft_GLOBAL__sub_I__Z5printv
0000000000000022t_Z41__static_initialization_and_destruction_0ii
0000000000000000T_Z5printv
U_ZNSolsEPFRSoS_E
U_ZNSt8ios_base4InitC1Ev
U_ZNSt8ios_base4InitD1Ev
U_ZSt4cout
U_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
0000000000000000b_ZStL8__ioinit
U_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
(4)顯示目標(biāo)文件各個(gè)段的頭部摘要信息。
[root@TENCENT64~]#objdump-hobjdump.o
objdump.o:fileformatelf64-x86-64
Sections:
IdxNameSizeVMALMAFileoffAlgn
0.text0000007400000000000000000000000000000000000000402**2
CONTENTS,ALLOC,LOAD,RELOC,READONLY,CODE
1.data0000000000000000000000000000000000000000000000b42**2
CONTENTS,ALLOC,LOAD,DATA
2.bss0000000100000000000000000000000000000000000000b42**2
ALLOC
3.rodata0000000800000000000000000000000000000000000000b42**0
CONTENTS,ALLOC,LOAD,READONLY,DATA
4.init_array0000000800000000000000000000000000000000000000c02**3
CONTENTS,ALLOC,LOAD,RELOC,DATA
5.debug_info000014f900000000000000000000000000000000000000c82**0
CONTENTS,RELOC,READONLY,DEBUGGING
6.debug_abbrev0000039f00000000000000000000000000000000000015c12**0
CONTENTS,READONLY,DEBUGGING
7.debug_aranges0000003000000000000000000000000000000000000019602**0
CONTENTS,RELOC,READONLY,DEBUGGING
8.debug_line0000024400000000000000000000000000000000000019902**0
CONTENTS,RELOC,READONLY,DEBUGGING
9.debug_str00000e4c0000000000000000000000000000000000001bd42**0
CONTENTS,READONLY,DEBUGGING
10.comment0000002d0000000000000000000000000000000000002a202**0
CONTENTS,READONLY
11.note.GNU-stack000000000000000000000000000000000000000000002a4d2**0
CONTENTS,READONLY
12.eh_frame000000780000000000000000000000000000000000002a502**3
CONTENTS,ALLOC,LOAD,RELOC,READONLY,DATA
參考文獻(xiàn)
[1] objdump manual
[2] objdump命令.Linux命令大全
[3] GNU Binutils
責(zé)任編輯:xj
原文標(biāo)題:每天一個(gè) Linux 命令(106):objdump 命令
文章出處:【微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
Linux
+關(guān)注
關(guān)注
87文章
11312瀏覽量
209714 -
命令
+關(guān)注
關(guān)注
5文章
685瀏覽量
22044
原文標(biāo)題:每天一個(gè) Linux 命令(106):objdump 命令
文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論