GCC的編譯過程

2021-10-01 21:30:39 字數 1042 閱讀 2854

用編譯器gcc生成可執行檔案,看似簡單的一步完成,其實包含了四個過程。分別是:

預處理(pre-processing):這一步需要分析各種預處理命令,如#define、#include、#if,#ifndef,#ifdef,#endif,#undef等。對於巨集而言,gcc會將巨集定義的內容直接替換,#include則是將.**件裡的內容直接在源程式中展開。對於#if等,會先判斷預編譯的巨集定義條件是否滿足,以此決定**段是否生效。gcc的預處理是通過cpp程式來處理的,預處理生成.i檔案,以hello.c為例:

gcc –e hello.c –o hello.i
編譯(compilation):在這個階段中,gcc首先要檢查**的規範性、是否有語法錯誤等。在檢查無誤後,gcc會將**翻譯成組合語言。這一步生成.s檔案,使用者可以使用」-s」選項來進行檢視。-s讓編譯器在編譯生成.s檔案後停止,不進行後續過程。

gcc –s hello.i –o hello.s
彙編(assemble):這一步將組合語言作為輸入,為每乙個原始檔(包括庫檔案)生成擴充套件名為.o的二進位制目標檔案。

gcc –c hello.s –o hello.o
鏈結(linking):鏈結的作用在於,找到.**件中定義的系統函式實現,分為靜態鏈結和動態鏈結。其中,靜態鏈結是指鏈結時,把庫檔案的**全部加入到可執行檔案中,因此生成的檔案比較大,但在執行時也就不再需要庫檔案了。其字尾名一般為」.a」。動態庫與之相反,在鏈結時並沒有把庫檔案的**加入到可執行檔案中,而是在程式執行時由執行時鏈結檔案載入庫,這樣可以節省系統的開銷。動態庫一般字尾名為」.so」。gcc預設使用動態鏈結。

完成鏈結之後,即會生成可執行檔案a.out,也可單獨指定檔名。用./可以直接執行。

gcc hello.o -o hello

gcc編譯過程

本文對gcc編譯器如何工作做乙個概要描述.更為詳細的資訊請參考編譯器手冊。當我們進行編譯的時候,要使用一系列的工具,我們稱之為工具鏈.其中包括 預處理器cpp,編譯器前端gcc g 彙編器as,聯結器ld.乙個編譯過程包括下面幾個階段 1 預處理。預處理器cpp將對原始檔中的巨集進行展開。2 編譯。...

gcc編譯過程

當我們進行編譯的時候,要使用一系列的工具,我們稱之為工具鏈.其中包括 預處理器cpp,編譯器前端gcc g 彙編器as,聯結器ld.乙個編譯過程包括下面幾個階段 1 預處理。預處理器cpp將對原始檔中的巨集進行展開。2 編譯。gcc將c檔案編譯成彙編檔案。3 彙編。as將彙編檔案編譯成機器碼。4 連...

GCC編譯過程

第一步 預處理後結束 引數 e gcc e hello.c o hello.i 檢視hello.i檔案中的內容 cat hello.i stdio.h的內容插入到檔案裡去了,巨集定義也在預處理中都做了相應的處理 第二步 將hello.i 編譯為 目標 引數 c gcc c hello.i o hel...