步驟命令
說明預處理
gcc -e hello.c -o hello.i
1. 將所有#define刪除,並且展開所有的巨集定義
2. 處理所有的條件預編譯指令,如#if #ifdef #undef #ifndef #endif #elif
3. 處理#include,將包含的檔案插入到此處,這是乙個遞迴的過程
4. 刪除所有注釋 // /* */
5. 新增行號和檔名標識,以便於編譯時產生的錯誤警告能顯示行號
6. 保留#pragma編譯器指令
編譯gcc -s hello.i -o hello.s
將預處理完的.i檔案進行一系列的詞法分析、語法分析、語義分析及優化後生成響應的彙編**檔案,這是整個程式構建的最核心的部分,也是最複雜的部分
彙編gcc -c hello.s -o hello.o或者as hello.s -o hello.o
彙編是將第二步生成的彙編**程式設計機器可執行的指令,每乙個彙編語句幾乎都對應一條機器指令
鏈結鏈結動態庫和靜態庫
gcc -e hello.c -o hello.i 預處理
gcc -s hello.i -o hello.s 編譯
gcc -c hello.s -o hello.o 彙編(生成目標**)
編譯後成成的檔案
gcc -c hello.c 直接進行編譯
目標檔案就是源**經過編譯後但未進行鏈結的那些中間檔案linux下的 .o檔案就是目標檔案,目標檔案和可執行檔案內容和格式幾乎都一樣,所以我們可以廣義地將目標檔案和可執行文化看成一型別檔案。他們都是按照elf檔案格式儲存的。
命令說明
objdump -h filename.o
列印主要段的資訊
objdump -x filename.o
列印更多的詳細資訊
objdump -s filename.o
將所有段的內容以16進製制方式列印出來
objdump -d filename.o 或者-s
將所有包含指令的段反彙編
objdump -t filename.o
檢視所有的符號以及他們所在段
readelf -h filename.o
檢視.o檔案的檔案頭詳細資訊
readelf -s filename.o
顯示.o檔案中的所有段,即檢視段表
readelf -s filename.o
檢視符號表
size filename.o
檢視.o檔案中各個段所佔大小
nm filename.o
檢視.o檔案中所有的符號演示
行欄位說明:
字段說明
.text
**段(存放函式的二進位制機器指令)
.data
資料段(存已初始化的區域性/全域性靜態變數、未初始化的全域性靜態變數)
.bss
bss段(宣告未初始化變數所佔大小)
.rodata
唯讀資料段(存放 " " 引住的唯讀字串)
.comment
注釋資訊段
.node.gun-stack
堆疊提示段
列欄位說明
字段說明
size
段的長度
file off
段的所在位置(即距離檔案頭的偏移位置)
段的屬性說明
段屬性說明
contents
表示該段在檔案中存在
alloc
表示只分配了大小,但沒有存內容
gcc編譯流程
可以利用gcc的引數來控制執行的過程,這樣就可以更深入的了解編譯c程式的過程。下面將通過對乙個程式的編譯來演示整個過程。includeint main 1 預處理 編譯器將c程式的標頭檔案編譯進來,還有巨集的替換,可以用gcc的引數 e來參看。命令 gcc e hello.c o hello.i 作...
GCC編譯流程
gcc使用的基本語法為 gcc option filename 這裡option是gcc使用時的一些選項,可以通過指定不同的選項實現不同的功能。這裡的filename是gcc要編譯的檔案,gcc會根據使用者指定的編譯選項以及所識別的檔案字尾名來對編譯檔案進行響應的處理。1,預處理階段 預處理功能分為...
gcc編譯流程
1 預處理 處理原始檔中以 開頭的語句。如標頭檔案 巨集定義等語句進行處理,c檔案生成.i檔案。1 巨集定義的目的為了提高 的可讀性,此時對巨集定義進行原樣替換。2 在標頭檔案中主要包含函式的宣告 結構體的宣告等。宣告的目的是為了告訴編譯器做語法檢查,防 止呼叫時出現錯誤。此時在預處理的作用是把頭檔...