日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

【Linux】一步一步学Linux——objdump命令(254)

發(fā)布時(shí)間:2024/4/21 linux 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Linux】一步一步学Linux——objdump命令(254) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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 用文件名和行號(hào)標(biāo)注相應(yīng)的目標(biāo)代碼,僅僅和-d、-D或者-r一起使用使用-ld和使用-d的區(qū)別不是很大,在源碼級(jí)調(diào)試的時(shí)候有用,要求編譯時(shí)使用了-g之類的調(diào)試編譯選項(xiàng)。 -m machine --architecture=machine 指定反匯編目標(biāo)文件時(shí)使用的架構(gòu),當(dāng)待反匯編文件本身沒描述架構(gòu)信息的時(shí)候(比如S-records),這個(gè)選項(xiàng)很有用。可以用-i選項(xiàng)列出這里能夠指定的架構(gòu). --reloc -r 顯示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反匯編后的格式顯示出來。 --dynamic-reloc -R 顯示文件的動(dòng)態(tài)重定位入口,僅僅對(duì)于動(dòng)態(tài)目標(biāo)文件意義,比如某些共享庫(kù)。 -s --full-contents 顯示指定section的完整內(nèi)容。默認(rèn)所有的非空section都會(huì)被顯示。 -S --source 盡可能反匯編出源代碼,尤其當(dāng)編譯的時(shí)候指定了-g這種調(diào)試參數(shù)時(shí),效果比較明顯。隱含了-d參數(shù)。 --show-raw-insn 反匯編的時(shí)候,顯示每條匯編指令對(duì)應(yīng)的機(jī)器碼,如不指定--prefix-addresses,這將是缺省選項(xiàng)。 --no-show-raw-insn 反匯編時(shí),不顯示匯編指令的機(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 顯示文件的符號(hào)表入口。類似于nm -s提供的信息 -T --dynamic-syms 顯示文件的動(dòng)態(tài)符號(hào)表入口,僅僅對(duì)動(dòng)態(tài)目標(biāo)文件意義,比如某些共享庫(kù)。它顯示的信息類似于 nm -D|--dynamic 顯示的信息。 -V --version 版本信息 --all-headers -x 顯示所可用的頭信息,包括符號(hào)表、重定位入口。-x 等價(jià)于-a -f -h -r -t 同時(shí)指定。 -z --disassemble-zeroes 一般反匯編輸出將省略大塊的零,該選項(xiàng)使得這些零塊也被反匯編。 @file 可以將選項(xiàng)集中到一個(gè)文件中,然后使用這個(gè)@file選項(xiàng)載入。

04. 參考示例

4.1 查看當(dāng)前使用的objdump的版本號(hào)

[deng@localhost 5share_lib]$ objdump -V GNU objdump version 2.27-27.base.el7 Copyright (C) 2016 Free Software Foundation, Inc. 這個(gè)程序是自由軟件;您可以遵循 GNU 通用公共授權(quán)版本 3 或 (您自行選擇的) 稍后版本再發(fā)布它。 這個(gè)程序不含任何擔(dān)保。 [deng@localhost 5share_lib]$

4.2 查看檔案庫(kù)文件中的信息

[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]$

這里,顯示的信息是相對(duì)于 -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是不會(huì)運(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是不會(huì)運(yùn)行成功的。另外-S命令對(duì)于包含調(diào)試信息的目標(biāo)文件,顯示的效果比較好,如果編譯時(shí)沒有指定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)編譯的時(shí)候指定了-g這種調(diào)試參數(shù)時(shí),反匯編的效果比較明顯。隱含了-d參數(shù)。

4.7 顯示文件的符號(hào)表入口

[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 顯示文件的符號(hào)表入口,將底層符號(hào)解碼并表示成用戶級(jí)別

[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]$

對(duì)text段的內(nèi)容進(jìn)行了反匯編。

4.10 反匯編特定段,并將匯編代碼對(duì)應(yīng)的文件名稱和行號(hào)對(duì)應(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"指定用文件名和行號(hào)標(biāo)注相應(yīng)的目標(biāo)代碼,僅僅和-d、-D或者-r一起使用,使用-ld和使用-d的區(qū)別不是很大,在源碼級(jí)調(diào)試的時(shí)候有用,要求編譯時(shí)使用了-g之類的調(diào)試編譯選項(xiàng)。

4.11 顯示目標(biāo)文件各個(gè)段的頭部摘要信息

[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)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。