0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用于查看目標(biāo)文件或可執(zhí)行文件的組成信息的命令:objdump命令

Linux愛好者 ? 來源:Linux愛好者 ? 作者:戀貓大鯉魚 ? 2021-02-09 18:17 ? 次閱讀

1.功能簡介

objdump 命令是 GNU Binutils 二進(jìn)制工具集的一員,用于查看目標(biāo)文件或可執(zhí)行文件的組成信息,以可讀的形式打印二進(jìn)制文件的內(nèi)容。

2.命令格式

objdump[OPTIONS]OBJFILES

3.選項(xiàng)說明

-a,--archive-headers
顯示檔案頭信息,展示檔案每一個成員的文件格式。效果等同于命令 ar -tv
-b,--target=BFDNAME
指定目標(biāo)碼格式。這不是必須的,objdump 能自動識別許多格式,比如 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)文件中的符號解碼成用戶級名稱。比如移除符號修飾時在變量與函數(shù)名前添加的下劃線等。
-d,--disassemble
反匯編目標(biāo)文件,將機(jī)器指令反匯編成匯編代碼
-D,--disassemble-all
與-d類似,但反匯編所有段(section)
-z,--disassemble-zeroes
一般反匯編輸出將省略零塊,該選項(xiàng)使得這些零塊也被反匯編
-EB,-EL,--endian={big|little}
指定目標(biāo)文件的字節(jié)序,在目標(biāo)文件沒描述字節(jié)序時很有用,例如 S-records。這個選項(xiàng)只影響反匯編
-f,--file-headers
顯示每一個目標(biāo)文件的頭信息
-F,--file-offsets
反匯編時,打印每一個符號的偏移地址
--file-start-context
顯示源碼/匯編代碼(假設(shè)為-S)時,將上下文擴(kuò)展到文件的開頭
-g,--debugging
顯示調(diào)試信息。企圖解析保存在文件中的調(diào)試信息并以 C 語言的語法顯示出來。僅僅支持某些類型的調(diào)試信息。有些其他的格式被readelf -w支持
-e,--debugging-tags
類似-g選項(xiàng),但是生成的信息是和ctags工具相兼容的格式
-h,--section-headers,--headers
顯示目標(biāo)文件各個section的頭部摘要信息
-i,--info
顯示對于-b或者-m選項(xiàng)可用的架構(gòu)和目標(biāo)格式列表
-j,--section=NAME
僅顯示指定名稱的section的信息
-l,--line-numbers
用文件名和行號標(biāo)注相應(yīng)的目標(biāo)代碼,僅僅和-d、-D或者-r一起使用
-S,--source
反匯編時盡可能使用源代碼表示。隱含了-d參數(shù)
-m,--architecture=MACHINE
指定反匯編目標(biāo)文件時使用的架構(gòu),當(dāng)待反匯編文件本身沒描述架構(gòu)信息的時候(比如S-records),這個選項(xiàng)很有用??梢杂?i選項(xiàng)列出這里能夠指定的架構(gòu)
-M,--disassembler-options=OPTIONS
給反匯編程序傳遞參數(shù),可以指定多個,使用逗號分隔
-p,--private-headers
打印目標(biāo)文件格式的特定信息。打印的信息取決于目標(biāo)文件格式,對于某些目標(biāo)文件格式,不打印任何附加信息。
-P,--private=OPTIONS
打印目標(biāo)文件格式的特定信息。OPTIONS 是一個逗號分隔的列表。例如對于XCOFF,可用的選項(xiàng)有 header, aout, sections, syms, relocs, lineno, loader, except, typchk, traceback and toc
-r,--reloc
顯示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反匯編后的格式顯示出來
-R,--dynamic-reloc
顯示文件的動態(tài)重定位入口,僅僅對于動態(tài)目標(biāo)文件意義,比如某些共享庫
-s,--full-contents
顯示section的完整內(nèi)容。默認(rèn)所有的非空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]
顯示文件中調(diào)試段的內(nèi)容,如果存在的話
-G,--stabs
顯示請求的任何 section 的全部內(nèi)容。顯示段 .stab、.stab.index 和 .stab.excl 的內(nèi)容
-t,--syms
顯示文件的符號表入口。類似于nm -s提供的信息
-T,--dynamic-syms
顯示文件的動態(tài)符號表入口,僅僅對動態(tài)目標(biāo)文件意義,比如某些共享庫。它顯示的信息類似于 nm -D,--dynamic 顯示的信息
-x,--all-headers
顯示所可用的頭信息,包括符號表、重定位入口。-x 等價于-a -f -h -p -r -t 同時指定
-w,--wide
為具有超過80列的輸出設(shè)備格式化某些行。也不要在顯示符號名稱時截斷符號名稱
--start-address=ADDRESS
從指定地址開始顯示數(shù)據(jù),該選項(xiàng)影響-d、-r和-s選項(xiàng)的輸出
--stop-address=ADDRESS
顯示數(shù)據(jù)直到指定地址為止,該項(xiàng)影響-d、-r和-s選項(xiàng)的輸出
--prefix-addresses
反匯編的時候,顯示每一行的完整地址。這是一種比較老的反匯編格式
--no-show-raw-insn
反匯編時,不顯示匯編指令的機(jī)器碼。當(dāng)使用--prefix-addresses時,這是缺省選項(xiàng)
--adjust-vma=OFFSET
當(dāng)解析信息時,首先給所有的段添加偏移值offset。當(dāng)段地址與符號表不符時,這個選項(xiàng)很有用。比如將段放置到特殊地址,因?yàn)槟硞€格式無法表示段地址,比如 a.out
--special-syms
顯示特殊符號與用戶不關(guān)心的符號
--prefix=PREFIX
當(dāng)使用-S時,指定前綴添加到絕對路徑中
--prefix-strip=LEVEL
指定剝離絕對路徑中多少個前綴目錄名。此選項(xiàng)只有在使用了選項(xiàng)--prefix=PREFIX 才有效
--insn-width=WIDTH
指定反匯編后的指令輸出的行寬,單位字節(jié)
-V,--version
版本信息
-H,--help
幫助信息

4.常用示例

首先給出后面大部分測試所基于的源代碼以及編譯指令。涉及兩個 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

然后通過ar命令將兩個目標(biāo)文件打包成靜態(tài)庫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)文件的符號表入口。

[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)顯示目標(biāo)文件各個段的頭部摘要信息。

[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)題:每天一個 Linux 命令(106):objdump 命令

文章出處:【微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207920
  • 命令
    +關(guān)注

    關(guān)注

    5

    文章

    658

    瀏覽量

    21929

原文標(biāo)題:每天一個 Linux 命令(106):objdump 命令

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    labview怎么生成可執(zhí)行文件

    生成可執(zhí)行文件(EXE)是LabVIEW程序開發(fā)中的一個重要步驟,它允許用戶將LabVIEW項(xiàng)目打包成一個獨(dú)立的應(yīng)用程序,便于在沒有安裝LabVIEW的計算機(jī)上運(yùn)行。 1. 準(zhǔn)備工作 在開始生成
    的頭像 發(fā)表于 09-04 17:07 ?240次閱讀

    labview生成可執(zhí)行程序后vi都在同一路徑下嗎

    在LabVIEW中,當(dāng)您生成可執(zhí)行程序(exe文件)后,VI(虛擬儀器)并不直接以文件的形式存在于可執(zhí)行文件的同一物理路徑下。實(shí)際上,LabVIEW的
    的頭像 發(fā)表于 09-04 17:06 ?224次閱讀

    嵌入式學(xué)習(xí)-常見的shell命令文件操作相關(guān)命令

    、whereis查找文件命令:whereis功能:用于定位可執(zhí)行文件、源代碼文件、幫助文件
    發(fā)表于 08-20 09:40

    常見的shell命令文件操作相關(guān)命令

    用于定位可執(zhí)行文件、源代碼文件、幫助文件文件系統(tǒng)中的位置參數(shù):whereis [選項(xiàng)] 文件
    發(fā)表于 08-19 10:01

    430單片機(jī)代碼debug后無法生成可執(zhí)行文件

    軟件是用許可證注冊過的,代碼是正確的,但是點(diǎn)完右上角那個build鍵后,消息框說生成不了可執(zhí)行文件,如圖
    發(fā)表于 07-15 09:28

    labview生成exe文件如何配置文件

    LabVIEW是一種用于實(shí)時測試、控制和數(shù)據(jù)采集的編程環(huán)境。在開發(fā)過程中,您可以使用LabVIEW軟件生成可執(zhí)行文件(.exe),以便在沒有LabVIEW開發(fā)環(huán)境的計算機(jī)上運(yùn)行您的應(yīng)用程序。生成
    的頭像 發(fā)表于 12-27 16:28 ?1694次閱讀

    keil如何生成bin文件

    創(chuàng)建工程、編寫代碼、配置編譯選項(xiàng)、編譯生成可執(zhí)行文件、轉(zhuǎn)換為bin文件等。 創(chuàng)建工程 首先,打開Keil軟件,點(diǎn)擊“File”->“New”->“Project”,選擇適合的目標(biāo)設(shè)備,如STM32系列或其他ARM芯片。輸入項(xiàng)目名
    的頭像 發(fā)表于 12-15 13:43 ?9735次閱讀

    bootm命令執(zhí)行流程

    ,用來保存可執(zhí)行內(nèi)核映像的相關(guān)信息,主要包括內(nèi)核映像的加載地址、起始地址、可執(zhí)行入口地址等。 獲取內(nèi)核映像的相關(guān)信息是為后面的加載
    的頭像 發(fā)表于 12-04 17:33 ?890次閱讀
    bootm<b class='flag-5'>命令</b>的<b class='flag-5'>執(zhí)行</b>流程

    LabVIEW在不同操作系統(tǒng)上使VI、可執(zhí)行文件或安裝程序

    的。可執(zhí)行文件必須在目標(biāo)操作系統(tǒng)上構(gòu)建,并且不能在另一個操作系統(tǒng)上或同一操作系統(tǒng)的另一個版本上運(yùn)行。例如,Windows 7的安裝程序或可執(zhí)行文件在不同的Windows版本上(例如Windows XP
    發(fā)表于 12-02 21:47

    linux顯示文件行號命令

    的前面顯示行號。如果要顯示特定文件的行號,只需將 filename 替換為您的文件名即可。 除了 cat -n 命令,還有其他一些方法可以顯示文件的行號: nl
    的頭像 發(fā)表于 11-13 16:55 ?1580次閱讀

    linux刪除文件命令rm

    在Linux系統(tǒng)中,可以使用rm命令來刪除文件或目錄。該命令的功能是刪除一個目錄中的一個或多個文件或目錄,也可以將某個目錄及其下的所有文件
    的頭像 發(fā)表于 11-13 16:42 ?697次閱讀

    linux解壓gz文件命令

    在Linux系統(tǒng)中,可以使用gzip命令解壓.gz文件。gzip命令用于壓縮和解壓縮文件,使用方法如下: 解壓.gz
    的頭像 發(fā)表于 11-08 14:42 ?4648次閱讀

    linux中查找文件命令

    在Linux中,可以使用以下命令來查找文件: find 命令:可以在指定目錄及其子目錄中查找文件,支持根據(jù)文件名、
    的頭像 發(fā)表于 11-08 14:24 ?1058次閱讀

    linux中刪除文件命令

    在Linux中,可以使用 rm 命令來刪除文件。該命令有多個參數(shù)和選項(xiàng)可供使用,以根據(jù)不同的情況進(jìn)行文件刪除操作。例如: rm 命令后面跟上
    的頭像 發(fā)表于 11-08 14:11 ?597次閱讀

    shell腳本基本命令

    Shell腳本是一種可執(zhí)行文件,它包含了一組用某種特定語言編寫的命令,這些命令可以被解釋器(如bash)執(zhí)行。以下是一些常見的shell腳本基本命令
    的頭像 發(fā)表于 11-08 10:08 ?1735次閱讀