使用gcc自帶的objdump工具實現反彙編
阿新 • • 發佈:2021-11-14
objdump介紹
objdump 有點像那個快速檢視之類的工具,就是以一種可閱讀的格式讓你更多地瞭解二進位制檔案可能帶有的附加資訊。對於一般只想讓自己程式跑起來的程式設計師,這個命令沒有更多意義,對於想進一步瞭解系統的程式設計師,應該掌握這種工具。
objdump是gcc編譯器下一款反彙編工具,能夠反彙編目標檔案、可執行檔案。
基礎指令:
至少必須給出以下選項之一: -a, --archive-headers Display archive header information -f, --file-headers Display the contents of the overall file header -p, --private-headers Display object format specific file header contents -P, --private=OPT,OPT... Display object format specific contents -h, --[section-]headers Display the contents of the section headers -x, --all-headers Display the contents of all headers **-d, --disassemble Display assembler contents of executable sections** -D, --disassemble-all Display assembler contents of all sections **-S, --source Intermix source code with disassembly** -s, --full-contents Display the full contents of all sections requested -g, --debugging Display debug information in object file -e, --debugging-tags Display debug information using ctags style -G, --stabs Display (in raw form) any STABS info in the file -W[lLiaprmfFsoRt] or --dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames, =frames-interp,=str,=loc,=Ranges,=pubtypes, =gdb_index,=trace_info,=trace_abbrev,=trace_aranges, =addr,=cu_index] Display DWARF info in the file -t, --syms Display the contents of the symbol table(s) -T, --dynamic-syms Display the contents of the dynamic symbol table -r, --reloc Display the relocation entries in the file -R, --dynamic-reloc Display the dynamic relocation entries in the file @<file> Read options from <file> -v, --version Display this program's version number -i, --info List object formats and architectures supported -H, --help Display this information
指定反彙編格式:
objdump -S -d -M intel main.o
下列 i386/x86-64 特定的反彙編器選項在使用 **-M** 開關時可用(使用逗號分隔多個選項):
x86-64 Disassemble in 64bit mode
i386 Disassemble in 32bit mode
i8086 在 16 位模式下反彙編
att 用 AT&T 語法顯示指令
intel 用 Intel 語法顯示指令
在Window上
源c程式碼
/* praise1.c -- 使用不同型別的字串 */ #include <stdio.h> #define PRAISE "You are an extraordinary being." int main(void) { char name[40]; printf("What's your name? "); scanf("%s", name); printf("Hello, %s.%s\n", name, PRAISE); return 0; }
編譯階段 | 命令 | 截斷後的產物 |
---|---|---|
源程式 | ||
預處理 | gcc -E | 替換了巨集的C源程式(沒有了#define,#include…), 刪除了註釋 |
編譯 | gcc -S | 彙編源程式 |
彙編 | gcc -c | 目標檔案,二進位制檔案, 允許有不在此檔案中的外部變數、函式 |
連結 | gcc | 可執行程式,一般由多個目標檔案或庫連結而成, 二進位制檔案,所有變數、函式都必須找得到 |
在終端輸入
gcc -c -g -o hello hello.c
objdump -s -d hello > hello.s
-c
代表生成未連結的目標檔案。 hello.s
代表彙編檔案
在Linux上
gcc -g -o hello hello.c //生成可執行檔案
objdump -s -d hello > hello.s
linux 下目標檔案(預設副檔名是.o)和可執行檔案都是 ELF 格式(檔案內容按照一定格式進行組織)的二進位制檔案; 類似的,Windows 下 VISUAL C++ 編譯出來的目標檔案 (副檔名是.obj)採用 COFF 格式,而可執行檔案 (副檔名是.exe)採用 PE 格式, ELF 和 PE 都是從 COFF 發展而來的。
雖然生成的都是AT&T格式的彙編,但是不同平臺下可以看出其中的部分暫存器和地址不同。