1. 程式人生 > 其它 >使用gcc自帶的objdump工具實現反彙編

使用gcc自帶的objdump工具實現反彙編

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格式的彙編,但是不同平臺下可以看出其中的部分暫存器和地址不同。