1.功能簡介
objdump 命令是 GNU Binutils 二進制工具集的一員,用于查看目標文件或可執行文件的組成信息,以可讀的形式打印二進制文件的內容。
2.命令格式
objdump[OPTIONS]OBJFILES
3.選項說明
-a,--archive-headers
顯示檔案頭信息,展示檔案每一個成員的文件格式。效果等同于命令 ar -tv
-b,--target=BFDNAME
指定目標碼格式。這不是必須的,objdump 能自動識別許多格式,比如 objdump -b oasys -m vax -h fu.o 顯示 fu.o 的頭部摘要信息,明確指出該文件是 Vax 系統下用 Oasys 編譯器生成的目標文件。objdump -i 將給出這里可以指定的目標碼格式列表
-C,--demangle[=STYLE]
目標文件中的符號解碼成用戶級名稱。比如移除符號修飾時在變量與函數名前添加的下劃線等。
-d,--disassemble
反匯編目標文件,將機器指令反匯編成匯編代碼
-D,--disassemble-all
與-d類似,但反匯編所有段(section)
-z,--disassemble-zeroes
一般反匯編輸出將省略零塊,該選項使得這些零塊也被反匯編
-EB,-EL,--endian={big|little}
指定目標文件的字節序,在目標文件沒描述字節序時很有用,例如 S-records。這個選項只影響反匯編
-f,--file-headers
顯示每一個目標文件的頭信息
-F,--file-offsets
反匯編時,打印每一個符號的偏移地址
--file-start-context
顯示源碼/匯編代碼(假設為-S)時,將上下文擴展到文件的開頭
-g,--debugging
顯示調試信息。企圖解析保存在文件中的調試信息并以 C 語言的語法顯示出來。僅僅支持某些類型的調試信息。有些其他的格式被readelf -w支持
-e,--debugging-tags
類似-g選項,但是生成的信息是和ctags工具相兼容的格式
-h,--section-headers,--headers
顯示目標文件各個section的頭部摘要信息
-i,--info
顯示對于-b或者-m選項可用的架構和目標格式列表
-j,--section=NAME
僅顯示指定名稱的section的信息
-l,--line-numbers
用文件名和行號標注相應的目標代碼,僅僅和-d、-D或者-r一起使用
-S,--source
反匯編時盡可能使用源代碼表示。隱含了-d參數
-m,--architecture=MACHINE
指定反匯編目標文件時使用的架構,當待反匯編文件本身沒描述架構信息的時候(比如S-records),這個選項很有用??梢杂?i選項列出這里能夠指定的架構
-M,--disassembler-options=OPTIONS
給反匯編程序傳遞參數,可以指定多個,使用逗號分隔
-p,--private-headers
打印目標文件格式的特定信息。打印的信息取決于目標文件格式,對于某些目標文件格式,不打印任何附加信息。
-P,--private=OPTIONS
打印目標文件格式的特定信息。OPTIONS 是一個逗號分隔的列表。例如對于XCOFF,可用的選項有 header, aout, sections, syms, relocs, lineno, loader, except, typchk, traceback and toc
-r,--reloc
顯示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反匯編后的格式顯示出來
-R,--dynamic-reloc
顯示文件的動態重定位入口,僅僅對于動態目標文件意義,比如某些共享庫
-s,--full-contents
顯示section的完整內容。默認所有的非空section都會被顯示
-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]
顯示文件中調試段的內容,如果存在的話
-G,--stabs
顯示請求的任何 section 的全部內容。顯示段 .stab、.stab.index 和 .stab.excl 的內容
-t,--syms
顯示文件的符號表入口。類似于nm -s提供的信息
-T,--dynamic-syms
顯示文件的動態符號表入口,僅僅對動態目標文件意義,比如某些共享庫。它顯示的信息類似于 nm -D,--dynamic 顯示的信息
-x,--all-headers
顯示所可用的頭信息,包括符號表、重定位入口。-x 等價于-a -f -h -p -r -t 同時指定
-w,--wide
為具有超過80列的輸出設備格式化某些行。也不要在顯示符號名稱時截斷符號名稱
--start-address=ADDRESS
從指定地址開始顯示數據,該選項影響-d、-r和-s選項的輸出
--stop-address=ADDRESS
顯示數據直到指定地址為止,該項影響-d、-r和-s選項的輸出
--prefix-addresses
反匯編的時候,顯示每一行的完整地址。這是一種比較老的反匯編格式
--no-show-raw-insn
反匯編時,不顯示匯編指令的機器碼。當使用--prefix-addresses時,這是缺省選項
--adjust-vma=OFFSET
當解析信息時,首先給所有的段添加偏移值offset。當段地址與符號表不符時,這個選項很有用。比如將段放置到特殊地址,因為某個格式無法表示段地址,比如 a.out
--special-syms
顯示特殊符號與用戶不關心的符號
--prefix=PREFIX
當使用-S時,指定前綴添加到絕對路徑中
--prefix-strip=LEVEL
指定剝離絕對路徑中多少個前綴目錄名。此選項只有在使用了選項--prefix=PREFIX 才有效
--insn-width=WIDTH
指定反匯編后的指令輸出的行寬,單位字節
-V,--version
版本信息
-H,--help
幫助信息
4.常用示例
首先給出后面大部分測試所基于的源代碼以及編譯指令。涉及兩個 C++ 源文件。
objdump.cpp:
main.cpp:
#include
usingnamespacestd;
voidprint();
intmain()
{
print();
}
使用-g選項加入調試信息,分別編譯生成目標文件objdump.o與main.o。
g++-c-gobjdump.cpp-oobjdump.o
g++-c-gmain.cpp-omain.o
然后通過ar命令將兩個目標文件打包成靜態庫libobjdump.a。
arcrvlibobjdump.amain.oobjdump.o
(1)查看檔案包含的目標文件列表。
[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也可以列出檔案中包含的目標文件。
[root@TENCENT64~]#ar-tvlibobjdump.a
rw-r--r--0/018696Mar820:252019main.o
rw-r--r--0/021352Mar820:252019objdump.o
(2)顯示目標文件objdump.o的代碼段(.text)內容。
[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..].
注意,不能單獨使用-j或者–section選項,一定要加上-s選項。
(3)反匯編objdump.o中的text段內容,并盡可能用源代碼形式表示。
[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)顯示目標文件的符號表入口。
[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
這里,輸出的信息類似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)顯示目標文件各個段的頭部摘要信息。
[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
參考文獻
[1] objdump manual
[2] objdump命令.Linux命令大全
[3] GNU Binutils
責任編輯:xj
原文標題:每天一個 Linux 命令(106):objdump 命令
文章出處:【微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
-
Linux
+關注
關注
87文章
11342瀏覽量
210136 -
命令
+關注
關注
5文章
696瀏覽量
22075
原文標題:每天一個 Linux 命令(106):objdump 命令
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論