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

如何查看 C 編譯產出的 .obj 目標檔案?反組譯與除錯指南

     編輯:C 語言問答

本質:.obj 是二進制機器碼 + 符號表 + 重定位資訊,非原始碼

編譯階段:`源碼 (.c) → 預處理 (.i) → 編譯 (.s 組語) → 組譯 (.obj/.o)`。
**.obj 內容**:機器指令 (二進制)、符號表 (函式/變數名、型別、可見性)、重定位條目 (外部符號引用、段偏移)、除錯資訊 (DWARF/CodeView/PDB)、**無原始碼**。

檢視 .obj 的標準工具鏈

平台/工具鏈檢視機器碼 (反組譯)檢視符號/段/重定位檢視除錯資訊
GCC/Clang (Linux/macOS/MinGW)`objdump -d file.obj` / `objdump -D file.obj` (全段)`nm -C file.obj` (符號表)、`readelf -S file.obj` (段表)、`objdump -r file.obj` (重定位)`objdump -g file.obj` / `readelf --debug-dump=info file.obj`
MSVC (Windows)`dumpbin /DISASM file.obj``dumpbin /SYMBOLS file.obj`、`dumpbin /SECTIONS file.obj`、`dumpbin /RELOCATIONS file.obj``dumpbin /PDB:file.pdb` (需對應 .pdb)
通用圖形化IDA Pro / Ghidra / Binary Ninja / Hopper — 載入 .obj,自動識別函式、交叉引用、控制流圖同上同上
線上快速查看Compiler Explorer — 貼上源碼,即時看對應組語 (支援 GCC/Clang/MSVC/ICC/Zapcc,可勾選「Show object file」)——

常見需求與對應操作

  • 確認函式是否被內聯/優化掉:`nm -C file.obj | grep func_name` 有符號 → 未內聯/保留;無符號 → 可能內聯/靜態內聯/優化刪除。加 `__attribute__((used))` / `/OPT:NOREF` 強制保留。
  • 定義未定義引用 (Linker Error LNK2001/undefined reference):`nm -u file.obj` 列出未定義符號 → 確認哪個 .c 應定義、哪個 .h 應宣告 `extern`、庫鏈接順序正確。
  • 檢查呼叫慣例/參數傳遞/棧幀佈局:`objdump -d file.obj` 看 `push`/`mov`/`call`/`ret` 指令序列,對照 ABI 文檔 (System V AMD64 / Microsoft x64 / ARM AAPCS)。
  • 提取嵌入式固件 .obj 燒錄映像:`objcopy -O binary file.obj firmware.bin` (GNU objcopy),或鏈接器腳本直接產出 `.bin`/`.hex`。

進階:原始碼級除錯而非看 .obj

**現代工作流不看 .obj,看源碼除錯**:

  1. 編譯加除錯資訊:`-g -Og` (GCC/Clang) / `/Zi /Od` (MSVC)。
  2. 啟動除錯器:`gdb ./exe` / `lldb ./exe` / VS Code (C/C++ Extension) / Visual Studio / CLion。
  3. 下斷點、單步、觀察變數、呼叫堆疊、記憶體視窗、暫存器視窗 — **直接對應源碼行號、變數名、型別**。
  4. 若無源碼 (第三方庫):**IDA Pro/Ghidra 載入 .so/.dll/.exe + PDB/DWARF**,仍可源碼級除錯 (符號匹配)。

總結

.obj 是**給鏈接器看的中間產物**,人類讀取需反組譯工具 (`objdump`/`dumpbin`/IDA/Ghidra)。**日常開發請直接用源碼級除錯器**,只在鏈接錯誤、優化驗證、逆向分析、固件提取等特定場景才需檢視 .obj。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved