1. 程式人生 > 其它 >使用GCC編譯c源程式經歷的幾個步驟

使用GCC編譯c源程式經歷的幾個步驟

  1.第一步首先是對源程式進行預編譯,預編譯的過程比較簡單,主要做如下的事:

    1)將開頭的巨集定義如#define全部刪除,並在程式中出現該巨集的位置使用巨集值替代

    2)處理預編譯指令和條件預編譯指令,例如如果出現了#include<XX檔案>,編譯器會找到XX檔案並將其全部插入到原include語句的位置處

    3)刪除所有的註釋;新增行號和檔名標識等。

  預編譯的指令是:

gcc -E main.c -o main.i  #其中-E表示對main.c源程式進行預編譯,-o後面接輸出檔名,這裡以.i為字尾名標識預編譯檔案

2.第二步是對預編譯過的程式進行編譯,即進行詞法分析、語法分析、語義分析及優化之後生成相應的彙編程式碼檔案(就是編譯原理這門課程講的內容)。這是整個程式構建的核心部分和最複雜的部分。這裡不展開解釋過程,想了解的話去學習編譯原理即可,下面給出進行編譯的指令:

gcc -S main.i -o main.s  #-S表示進行編譯

  前兩個步驟生成的結果其實還是指令,我們在Linux中可以用cat命令檢視其內容,後兩步生成的都是二進位制可執行檔案型別了,直接檢視會亂碼。

3.第三步,對優化好的彙編程式碼進行翻譯,將彙編指令逐一翻譯成CPU可識別的機器指令。命令如下:

gcc -c main.c -o main.o  

  本次步驟生成的程式碼檔案其實已經是二進位制可執行檔案格式了,但是可以看見字尾名是.o格式,並不是.bin格式,原因是這裡該步驟得到的變數或函式的地址還沒有最終確定,只是相對於檔案開頭的邏輯地址而已,還不能放到CPU上去執行。還需要進行重定位,即重新編排地址,理由很簡單,我們經常在一個程式檔案中呼叫另一個程式檔案中的某個函式或者變數,而我們在編譯該檔案時還沒有得到需要呼叫的變數或函式,所以地址也就不能確定。這需要在最後一步連結的過程綜合所有程式檔案確定最終的地址。.o檔案也稱為目標檔案。

4. 最後一步就是進行連結,也就是最終確定程式中函式或變數的地址,使其可以去處理器上執行,執行該步驟後生成的就是相應平臺上真正的可執行檔案了。執行該步驟可以直接用gcc得到,也可以使用ld命令手動連結。