【Linux】一步一步学Linux——objdump命令(254)
00. 目錄
文章目錄
- 00. 目錄
- 01. 命令概述
- 02. 命令格式
- 03. 常用選項
- 04. 參考示例
- 05. 附錄
01. 命令概述
objdump命令是用查看目標文件或者可執行的目標文件的構成的gcc工具。
objdump有點像快速查看之類的工具,就是以一種可閱讀的格式讓你更多地了解二進制文件可能帶有的附加信息。
02. 命令格式
用法:objdump <選項> <文件>03. 常用選項
-l --line-numbers 用文件名和行號標注相應的目標代碼,僅僅和-d、-D或者-r一起使用使用-ld和使用-d的區別不是很大,在源碼級調試的時候有用,要求編譯時使用了-g之類的調試編譯選項。 -m machine --architecture=machine 指定反匯編目標文件時使用的架構,當待反匯編文件本身沒描述架構信息的時候(比如S-records),這個選項很有用??梢杂?i選項列出這里能夠指定的架構. --reloc -r 顯示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反匯編后的格式顯示出來。 --dynamic-reloc -R 顯示文件的動態重定位入口,僅僅對于動態目標文件意義,比如某些共享庫。 -s --full-contents 顯示指定section的完整內容。默認所有的非空section都會被顯示。 -S --source 盡可能反匯編出源代碼,尤其當編譯的時候指定了-g這種調試參數時,效果比較明顯。隱含了-d參數。 --show-raw-insn 反匯編的時候,顯示每條匯編指令對應的機器碼,如不指定--prefix-addresses,這將是缺省選項。 --no-show-raw-insn 反匯編時,不顯示匯編指令的機器碼,如不指定--prefix-addresses,這將是缺省選項。 --start-address=address 從指定地址開始顯示數據,該選項影響-d、-r和-s選項的輸出。 --stop-address=address 顯示數據直到指定地址為止,該項影響-d、-r和-s選項的輸出。 -t --syms 顯示文件的符號表入口。類似于nm -s提供的信息 -T --dynamic-syms 顯示文件的動態符號表入口,僅僅對動態目標文件意義,比如某些共享庫。它顯示的信息類似于 nm -D|--dynamic 顯示的信息。 -V --version 版本信息 --all-headers -x 顯示所可用的頭信息,包括符號表、重定位入口。-x 等價于-a -f -h -r -t 同時指定。 -z --disassemble-zeroes 一般反匯編輸出將省略大塊的零,該選項使得這些零塊也被反匯編。 @file 可以將選項集中到一個文件中,然后使用這個@file選項載入。04. 參考示例
4.1 查看當前使用的objdump的版本號
[deng@localhost 5share_lib]$ objdump -V GNU objdump version 2.27-27.base.el7 Copyright (C) 2016 Free Software Foundation, Inc. 這個程序是自由軟件;您可以遵循 GNU 通用公共授權版本 3 或 (您自行選擇的) 稍后版本再發布它。 這個程序不含任何擔保。 [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 顯示可用的架構和目標結構列表
[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 選項可用的架構和目標格式列表。
4.4 示test.o文件中的text段的內容
[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]$這里注意,不能單獨使用-j或者–section,例如objdump --section=.text mytest.o是不會運行成功的。
4.5 反匯編test.o中的text段內容,并盡可能用源代碼形式表示
[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]$這里注意,不能單獨使用-j或者–section,例如objdump -j .text test.o是不會運行成功的。另外-S命令對于包含調試信息的目標文件,顯示的效果比較好,如果編譯時沒有指定g++的-g選項,那么目標文件就不包含調試信息,那么顯示效果就差多了。
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]$尤其當編譯的時候指定了-g這種調試參數時,反匯編的效果比較明顯。隱含了-d參數。
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 反匯編目標文件
[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段的內容進行了反匯編。
4.10 反匯編特定段,并將匯編代碼對應的文件名稱和行號對應上
[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]$這里,項"-d"從objfile中反匯編那些特定指令機器碼的section,而使用"-l"指定用文件名和行號標注相應的目標代碼,僅僅和-d、-D或者-r一起使用,使用-ld和使用-d的區別不是很大,在源碼級調試的時候有用,要求編譯時使用了-g之類的調試編譯選項。
4.11 顯示目標文件各個段的頭部摘要信息
[deng@localhost 1gcc]$ objdump -h test.o test.o: 文件格式 elf64-x86-64節: 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】一步一步學Linux系列教程匯總
總結
以上是生活随笔為你收集整理的【Linux】一步一步学Linux——objdump命令(254)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux】一步一步学Linux——t
- 下一篇: 【Linux】一步一步学Linux——l