1. 程式人生 > >GCC編譯系統基本過程詳解

GCC編譯系統基本過程詳解

GCC編譯驅動程式,將源程式hello.c翻譯為一個可執行目標檔案hello過程,分為四個階段;

下面是我總結的思維導圖,比純文字的好理解一點。

 

第一階段,預處理階段;前處理器(cpp)根據以字元#開頭的命令,修改原始的C程式。比如把hello.c中的第一行的#include<stdio.h> 命令告訴前處理器讀取系統檔案stdio.h的內容,並把它直接插入到程式文字中。結果就得到了另一個c程式,通常以”.i”,做為副檔名。

第二階段,編譯階段;編譯器(cc1)將文字檔案hello.i翻譯成文字檔案hello.s,他包含了一個組合語言程式。組合語言程式中的每條語句都以一種表準的文字格式確切的描述了一條低階機器語言指令。組合語言是非常有用的,因為它為不同高階語言的不用編譯器提供了通用的輸出語言。例如,c編譯器和fortran編譯器產生的輸出檔案用的都是一樣的組合語言。

第三階段,彙編階段。接下來,彙編器(as)將hello.s翻譯成機器語言指令,吧這些指令打包成一種叫做可重定位目標程式的格式,並將結果儲存在目標檔案hello.o中。hello.o檔案是一個二進位制檔案,他的位元組編碼是機器語言指令而不是字元。如果我們在文字編輯器中開啟hello.o檔案,看到的將是一堆亂碼。

第四階段,連線階段。hello程式呼叫了printf函式,他是每一個c編譯器都會提供的標準的c庫的一個函式。printf函式存在於一個名為printf.o的單獨的預編譯好了的目標檔案中,而這個檔案必須以某種方式合併到我們的hello.o程式中。聯結器(id)就是負責處理這種合併。結果就得到了hello檔案,他是一個可執行的目標檔案(或者簡稱為可執行檔案),可以被載入到記憶體中,由系統執行。