首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

GCC 生成匯編代碼查看全流程:從源碼到機器碼

     編輯:關於C語言

理解 C 代碼如何編譯為機器指令,是性能優化、逆向分析、嵌入式開發的核心技能。本文以簡單 sum 函數為例,演示 GCC 產生匯編、優化對比、GDB 反匯編、鏈接後地址重定位全流程。

測試代碼 code.c

int accum = 0;

int sum(int x, int y) {
    int t = x + y;
    accum += t;
    return t;
}

一、查看匯編源碼 gcc -S

gcc -S code.c        # 生成 code.s (AT&T 語法)
gcc -O2 -S code.c    # 開啟 O2 優化生成 code.s

未優化 (-O0) 關鍵片段

_sum:
    pushl %ebp
    movl %esp, %ebp
    subl $4, %esp           # 為局部變量 t 分配棧空間
    movl 12(%ebp), %eax     # eax = y
    addl 8(%ebp), %eax      # eax = x + y
    movl %eax, -4(%ebp)     # t = x + y
    movl -4(%ebp), %eax     # eax = t
    addl %eax, _accum       # accum += t
    movl -4(%ebp), %eax     # 返回值放入 eax
    leave
    ret

O2 優化後

_sum:
    pushl %ebp
    movl %esp, %ebp
    movl 12(%ebp), %eax     # eax = y
    movl 8(%ebp), %edx      # edx = x
    popl %ebp               # 早期恢復 ebp
    addl %edx, %eax         # eax = x + y
    addl %eax, _accum       # accum += x + y
    ret                     # 直接返回,省略 leave/棧幀

優化點: 省略棧幀建立/銷毀、寄存器直通計算、指令重排對齊 (.p2align)。

二、GDB 反匯編目標文件

gcc -c code.c -o code.o
gdb code.o
(gdb) x/19xb sum          # 檢查 sum 函數 19 字節機器碼
(gdb) disassemble sum     # 反匯編顯示

三、objdump 反匯編

objdump -d code.o         # 目標文件
objdump -d prog           # 可執行文件 (鏈接後)

輸出顯示指令地址、機器碼、助記符。鏈接後全局變量 _accum 地址從 0x0 重定位為實際地址 (如 0x402010)。

四、生成可執行文件並驗證

// main.c
int main() { return sum(1, 2); }

gcc -O2 -o prog code.o main.c
objdump -d prog | grep -A20 "_sum:"

鏈接後代碼與優化版幾乎一致,唯一差別:全局變量地址已解析為具體虛擬地址。

五、關鍵工具鏈總結

目的命令輸出
生成匯編源碼gcc -S [-O2] file.cfile.s (文本)
編譯不鏈接gcc -c file.cfile.o (目標文件)
反匯編目標/可執行文件objdump -d file.o/prog指令+機器碼+地址
GDB 動態反匯編gdb prog → disassemble func運行時上下文
查看機器碼十六進制gdb → x/Nxb addr原始字節
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved