【Linux】一步一步学Linux——objdump命令(254)
00. 目錄
文章目錄
- 00. 目錄
- 01. 命令概述
- 02. 命令格式
- 03. 常用選項(xiàng)
- 04. 參考示例
- 05. 附錄
01. 命令概述
objdump命令是用查看目標(biāo)文件或者可執(zhí)行的目標(biāo)文件的構(gòu)成的gcc工具。
objdump有點(diǎn)像快速查看之類的工具,就是以一種可閱讀的格式讓你更多地了解二進(jìn)制文件可能帶有的附加信息。
02. 命令格式
用法:objdump <選項(xiàng)> <文件>03. 常用選項(xiàng)
-l --line-numbers 用文件名和行號標(biāo)注相應(yīng)的目標(biāo)代碼,僅僅和-d、-D或者-r一起使用使用-ld和使用-d的區(qū)別不是很大,在源碼級調(diào)試的時候有用,要求編譯時使用了-g之類的調(diào)試編譯選項(xiàng)。 -m machine --architecture=machine 指定反匯編目標(biāo)文件時使用的架構(gòu),當(dāng)待反匯編文件本身沒描述架構(gòu)信息的時候(比如S-records),這個選項(xiàng)很有用。可以用-i選項(xiàng)列出這里能夠指定的架構(gòu). --reloc -r 顯示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反匯編后的格式顯示出來。 --dynamic-reloc -R 顯示文件的動態(tài)重定位入口,僅僅對于動態(tài)目標(biāo)文件意義,比如某些共享庫。 -s --full-contents 顯示指定section的完整內(nèi)容。默認(rèn)所有的非空section都會被顯示。 -S --source 盡可能反匯編出源代碼,尤其當(dāng)編譯的時候指定了-g這種調(diào)試參數(shù)時,效果比較明顯。隱含了-d參數(shù)。 --show-raw-insn 反匯編的時候,顯示每條匯編指令對應(yīng)的機(jī)器碼,如不指定--prefix-addresses,這將是缺省選項(xiàng)。 --no-show-raw-insn 反匯編時,不顯示匯編指令的機(jī)器碼,如不指定--prefix-addresses,這將是缺省選項(xiàng)。 --start-address=address 從指定地址開始顯示數(shù)據(jù),該選項(xiàng)影響-d、-r和-s選項(xiàng)的輸出。 --stop-address=address 顯示數(shù)據(jù)直到指定地址為止,該項(xiàng)影響-d、-r和-s選項(xiàng)的輸出。 -t --syms 顯示文件的符號表入口。類似于nm -s提供的信息 -T --dynamic-syms 顯示文件的動態(tài)符號表入口,僅僅對動態(tài)目標(biāo)文件意義,比如某些共享庫。它顯示的信息類似于 nm -D|--dynamic 顯示的信息。 -V --version 版本信息 --all-headers -x 顯示所可用的頭信息,包括符號表、重定位入口。-x 等價于-a -f -h -r -t 同時指定。 -z --disassemble-zeroes 一般反匯編輸出將省略大塊的零,該選項(xiàng)使得這些零塊也被反匯編。 @file 可以將選項(xiàng)集中到一個文件中,然后使用這個@file選項(xiàng)載入。04. 參考示例
4.1 查看當(dāng)前使用的objdump的版本號
[deng@localhost 5share_lib]$ objdump -V GNU objdump version 2.27-27.base.el7 Copyright (C) 2016 Free Software Foundation, Inc. 這個程序是自由軟件;您可以遵循 GNU 通用公共授權(quán)版本 3 或 (您自行選擇的) 稍后版本再發(fā)布它。 這個程序不含任何擔(dān)保。 [deng@localhost 5share_lib]$4.2 查看檔案庫文件中的信息
[deng@localhost 3static_lib]$ objdump -a libtest.a 在歸檔文件 libtest.a 中:add.o: 文件格式 elf64-x86-64 rw-r--r-- 0/0 1232 Jan 1 08:00 1970 add.osub.o: 文件格式 elf64-x86-64 rw-r--r-- 0/0 1224 Jan 1 08:00 1970 sub.omul.o: 文件格式 elf64-x86-64 rw-r--r-- 0/0 1224 Jan 1 08:00 1970 mul.o[deng@localhost 3static_lib]$ [deng@localhost 3static_lib]$ ar -tv libtest.a rw-r--r-- 0/0 1232 Jan 1 08:00 1970 add.o rw-r--r-- 0/0 1224 Jan 1 08:00 1970 sub.o rw-r--r-- 0/0 1224 Jan 1 08:00 1970 mul.o [deng@localhost 3static_lib]$4.3 顯示可用的架構(gòu)和目標(biāo)結(jié)構(gòu)列表
[deng@localhost 3static_lib]$ objdump -i BFD 頭文件版本 version 2.27-27.base.el7 elf64-x86-64(header 小端序, data 小端序)i386 elf32-i386(header 小端序, data 小端序)i386 elf32-iamcu(header 小端序, data 小端序)iamcu elf32-x86-64(header 小端序, data 小端序)i386 a.out-i386-linux(header 小端序, data 小端序)i386 pei-i386(header 小端序, data 小端序)i386 pei-x86-64(header 小端序, data 小端序)i386 elf64-l1om(header 小端序, data 小端序)l1om elf64-k1om(header 小端序, data 小端序)k1om elf64-little(header 小端序, data 小端序)i386l1omk1omiamcuplugin elf64-big(header 大端序, data 大端序)i386l1omk1omiamcuplugin elf32-little(header 小端序, data 小端序)i386l1omk1omiamcuplugin elf32-big(header 大端序, data 大端序)i386l1omk1omiamcuplugin plugin(header 小端序, data 小端序) srec(header 未知的端序, data 未知的端序)i386l1omk1omiamcuplugin symbolsrec(header 未知的端序, data 未知的端序)i386l1omk1omiamcuplugin verilog(header 未知的端序, data 未知的端序)i386l1omk1omiamcuplugin tekhex(header 未知的端序, data 未知的端序)i386l1omk1omiamcuplugin binary(header 未知的端序, data 未知的端序)i386l1omk1omiamcuplugin ihex(header 未知的端序, data 未知的端序)i386l1omk1omiamcupluginelf64-x86-64 elf32-i386 elf32-iamcu elf32-x86-64 i386 elf64-x86-64 elf32-i386 ----------- elf32-x86-64 l1om ------------ ---------- ----------- ------------ k1om ------------ ---------- ----------- ------------ iamcu ------------ ---------- elf32-iamcu ------------ plugin ------------ ---------- ----------- ------------ a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om i386 a.out-i386-linux pei-i386 pei-x86-64 ---------- ---------- l1om ---------------- -------- ---------- elf64-l1om ---------- k1om ---------------- -------- ---------- ---------- elf64-k1om iamcu ---------------- -------- ---------- ---------- ---------- plugin ---------------- -------- ---------- ---------- ---------- elf64-little elf64-big elf32-little elf32-big plugin srec i386 elf64-little elf64-big elf32-little elf32-big ------ srec l1om elf64-little elf64-big elf32-little elf32-big ------ srec k1om elf64-little elf64-big elf32-little elf32-big ------ srec iamcu elf64-little elf64-big elf32-little elf32-big ------ srec plugin elf64-little elf64-big elf32-little elf32-big ------ srec symbolsrec verilog tekhex binary ihex i386 symbolsrec verilog tekhex binary ihex l1om symbolsrec verilog tekhex binary ihex k1om symbolsrec verilog tekhex binary ihex iamcu symbolsrec verilog tekhex binary ihex plugin symbolsrec verilog tekhex binary ihex [deng@localhost 3static_lib]$這里,顯示的信息是相對于 -b 或者 -m 選項(xiàng)可用的架構(gòu)和目標(biāo)格式列表。
4.4 示test.o文件中的text段的內(nèi)容
[deng@localhost 1gcc]$ objdump --section=.text -s test.otest.o: 文件格式 elf64-x86-64Contents of section .text:0000 554889e5 bf000000 00e80000 0000b800 UH..............0010 0000005d c3 ...]. [deng@localhost 1gcc]$這里注意,不能單獨(dú)使用-j或者–section,例如objdump --section=.text mytest.o是不會運(yùn)行成功的。
4.5 反匯編test.o中的text段內(nèi)容,并盡可能用源代碼形式表示
[deng@localhost 1gcc]$ objdump -j .text -S test.otest.o: 文件格式 elf64-x86-64Disassembly of section .text:0000000000000000 <main>:0: 55 push %rbp1: 48 89 e5 mov %rsp,%rbp4: bf 00 00 00 00 mov $0x0,%edi9: e8 00 00 00 00 callq e <main+0xe>e: b8 00 00 00 00 mov $0x0,%eax13: 5d pop %rbp14: c3 retq [deng@localhost 1gcc]$這里注意,不能單獨(dú)使用-j或者–section,例如objdump -j .text test.o是不會運(yùn)行成功的。另外-S命令對于包含調(diào)試信息的目標(biāo)文件,顯示的效果比較好,如果編譯時沒有指定g++的-g選項(xiàng),那么目標(biāo)文件就不包含調(diào)試信息,那么顯示效果就差多了。
4.6 反匯編出test.o的源代碼
[deng@localhost 1gcc]$ objdump -S test.otest.o: 文件格式 elf64-x86-64Disassembly of section .text:0000000000000000 <main>:0: 55 push %rbp1: 48 89 e5 mov %rsp,%rbp4: bf 00 00 00 00 mov $0x0,%edi9: e8 00 00 00 00 callq e <main+0xe>e: b8 00 00 00 00 mov $0x0,%eax13: 5d pop %rbp14: c3 retq [deng@localhost 1gcc]$尤其當(dāng)編譯的時候指定了-g這種調(diào)試參數(shù)時,反匯編的效果比較明顯。隱含了-d參數(shù)。
4.7 顯示文件的符號表入口
[deng@localhost 1gcc]$ objdump -t test.otest.o: 文件格式 elf64-x86-64SYMBOL TABLE: 0000000000000000 l df *ABS* 0000000000000000 test.c 0000000000000000 l d .text 0000000000000000 .text 0000000000000000 l d .data 0000000000000000 .data 0000000000000000 l d .bss 0000000000000000 .bss 0000000000000000 l d .rodata 0000000000000000 .rodata 0000000000000000 l d .note.GNU-stack 0000000000000000 .note.GNU-stack 0000000000000000 l d .eh_frame 0000000000000000 .eh_frame 0000000000000000 l d .comment 0000000000000000 .comment 0000000000000000 g F .text 0000000000000015 main 0000000000000000 *UND* 0000000000000000 puts[deng@localhost 1gcc]$輸出的信息類似nm -s命令的輸出,相比較之下,nm命令的輸出如下:
[deng@localhost 1gcc]$ nm -s test.o 0000000000000000 T mainU puts [deng@localhost 1gcc]$4.8 顯示文件的符號表入口,將底層符號解碼并表示成用戶級別
[deng@localhost 1gcc]$ objdump -t -C test.otest.o: 文件格式 elf64-x86-64SYMBOL TABLE: 0000000000000000 l df *ABS* 0000000000000000 test.c 0000000000000000 l d .text 0000000000000000 .text 0000000000000000 l d .data 0000000000000000 .data 0000000000000000 l d .bss 0000000000000000 .bss 0000000000000000 l d .rodata 0000000000000000 .rodata 0000000000000000 l d .note.GNU-stack 0000000000000000 .note.GNU-stack 0000000000000000 l d .eh_frame 0000000000000000 .eh_frame 0000000000000000 l d .comment 0000000000000000 .comment 0000000000000000 g F .text 0000000000000015 main 0000000000000000 *UND* 0000000000000000 puts[deng@localhost 1gcc]$4.9 反匯編目標(biāo)文件
[deng@localhost 1gcc]$ objdump -d test.otest.o: 文件格式 elf64-x86-64Disassembly of section .text:0000000000000000 <main>:0: 55 push %rbp1: 48 89 e5 mov %rsp,%rbp4: bf 00 00 00 00 mov $0x0,%edi9: e8 00 00 00 00 callq e <main+0xe>e: b8 00 00 00 00 mov $0x0,%eax13: 5d pop %rbp14: c3 retq [deng@localhost 1gcc]$對text段的內(nèi)容進(jìn)行了反匯編。
4.10 反匯編特定段,并將匯編代碼對應(yīng)的文件名稱和行號對應(yīng)上
[deng@localhost 1gcc]$ objdump -d -l test.otest.o: 文件格式 elf64-x86-64Disassembly of section .text:0000000000000000 <main>: main():0: 55 push %rbp1: 48 89 e5 mov %rsp,%rbp4: bf 00 00 00 00 mov $0x0,%edi9: e8 00 00 00 00 callq e <main+0xe>e: b8 00 00 00 00 mov $0x0,%eax13: 5d pop %rbp14: c3 retq [deng@localhost 1gcc]$這里,項(xiàng)"-d"從objfile中反匯編那些特定指令機(jī)器碼的section,而使用"-l"指定用文件名和行號標(biāo)注相應(yīng)的目標(biāo)代碼,僅僅和-d、-D或者-r一起使用,使用-ld和使用-d的區(qū)別不是很大,在源碼級調(diào)試的時候有用,要求編譯時使用了-g之類的調(diào)試編譯選項(xiàng)。
4.11 顯示目標(biāo)文件各個段的頭部摘要信息
[deng@localhost 1gcc]$ objdump -h test.o test.o: 文件格式 elf64-x86-64節(jié): Idx Name Size VMA LMA File off Algn0 .text 00000015 0000000000000000 0000000000000000 00000040 2**0CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE1 .data 00000000 0000000000000000 0000000000000000 00000055 2**0CONTENTS, ALLOC, LOAD, DATA2 .bss 00000000 0000000000000000 0000000000000000 00000055 2**0ALLOC3 .rodata 0000000d 0000000000000000 0000000000000000 00000055 2**0CONTENTS, ALLOC, LOAD, READONLY, DATA4 .comment 0000002e 0000000000000000 0000000000000000 00000062 2**0CONTENTS, READONLY5 .note.GNU-stack 00000000 0000000000000000 0000000000000000 00000090 2**0CONTENTS, READONLY6 .eh_frame 00000038 0000000000000000 0000000000000000 00000090 2**3CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA [deng@localhost 1gcc]$4.12 反匯編所有
[deng@localhost 1gcc]$ objdump -D test.o test.o: 文件格式 elf64-x86-64Disassembly of section .text:0000000000000000 <main>:0: 55 push %rbp1: 48 89 e5 mov %rsp,%rbp4: bf 00 00 00 00 mov $0x0,%edi9: e8 00 00 00 00 callq e <main+0xe>e: b8 00 00 00 00 mov $0x0,%eax13: 5d pop %rbp14: c3 retq Disassembly of section .rodata:0000000000000000 <.rodata>:0: 68 65 6c 6c 6f pushq $0x6f6c6c655: 20 69 74 and %ch,0x74(%rcx)8: 63 61 73 movslq 0x73(%rcx),%espb: 74 00 je d <main+0xd>Disassembly of section .comment:0000000000000000 <.comment>:0: 00 47 43 add %al,0x43(%rdi)3: 43 3a 20 rex.XB cmp (%r8),%spl6: 28 47 4e sub %al,0x4e(%rdi)9: 55 push %rbpa: 29 20 sub %esp,(%rax)c: 34 2e xor $0x2e,%ale: 38 2e cmp %ch,(%rsi)10: 35 20 32 30 31 xor $0x31303220,%eax15: 35 30 36 32 33 xor $0x33323630,%eax1a: 20 28 and %ch,(%rax)1c: 52 push %rdx1d: 65 64 20 48 61 gs and %cl,%fs:0x61(%rax)22: 74 20 je 44 <main+0x44>24: 34 2e xor $0x2e,%al26: 38 2e cmp %ch,(%rsi)28: 35 2d 32 38 29 xor $0x2938322d,%eax...Disassembly of section .eh_frame:0000000000000000 <.eh_frame>:0: 14 00 adc $0x0,%al2: 00 00 add %al,(%rax)4: 00 00 add %al,(%rax)6: 00 00 add %al,(%rax)8: 01 7a 52 add %edi,0x52(%rdx)b: 00 01 add %al,(%rcx)d: 78 10 js 1f <.eh_frame+0x1f>f: 01 1b add %ebx,(%rbx)11: 0c 07 or $0x7,%al13: 08 90 01 00 00 1c or %dl,0x1c000001(%rax)19: 00 00 add %al,(%rax)1b: 00 1c 00 add %bl,(%rax,%rax,1)1e: 00 00 add %al,(%rax)20: 00 00 add %al,(%rax)22: 00 00 add %al,(%rax)24: 15 00 00 00 00 adc $0x0,%eax29: 41 0e rex.B (bad) 2b: 10 86 02 43 0d 06 adc %al,0x60d4302(%rsi)31: 50 push %rax32: 0c 07 or $0x7,%al34: 08 00 or %al,(%rax)... [deng@localhost 1gcc]$05. 附錄
參考:【Linux】一步一步學(xué)Linux系列教程匯總
總結(jié)
以上是生活随笔為你收集整理的【Linux】一步一步学Linux——objdump命令(254)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux】一步一步学Linux——t
- 下一篇: 【Linux】一步一步学Linux——l