GCC編譯的4個階段
阿新 • • 發佈:2020-12-13
技術標籤:Linux
GCC編譯一共有4個階段:預處理、編譯、彙編、連結。
gcc指令的一般格式
gcc [選項] 要編譯的檔案 [選項] [輸出檔案]
選項 | 說明 |
---|---|
-E | 預處理原始檔 |
-S | 編譯為彙編程式碼 |
-c | 編譯為目標檔案 |
-o outfile | 指定輸出檔案的檔名 |
eg:下面是一段很簡單的hello.c程式碼,以這段程式碼為例。
#include <stdio.h>
#define NAME "mao"
void main(){
printf("hello:%s\n",NAME);
}
1、預處理階段
預處理階段主要工作是標頭檔案的展開、巨集定義的替換。
gcc -E hello.c -o hello.i
2、編譯階段
gcc在編譯階段會進行程式碼規範性檢查、語法錯誤檢查,如果通過就會生成.s彙編檔案(彙編程式碼)
gcc -S hello.i -o hello.s
3、彙編階段
把 .s 檔案翻譯成二進位制.o檔案(目標檔案)
gcc -c hello.s -o hello.o
4、連結階段
彙編階段將程式碼編譯成了二進位制檔案,還需要和系統其他元件(比如標準庫、動態連結庫等)結合起來才能正常執行,比如呼叫print函式列印,在預處理階段也只是將“stdio.h”標頭檔案中的申明引入進來,沒有函式的實現,那怎麼呼叫它的呢?這就是連結的工作了,連結之前的操作都是對一個檔案進行處理,而連結可以看作是對多個檔案進行“打包”的過程,它將所有的目標檔案以及系統元件組合成一個可執行檔案。
gcc hello.o -o hello