gcc預處理 編譯 彙編 鏈結詳解

2021-08-08 19:50:26 字數 1155 閱讀 1516

讓我們來用最簡單的程式理解一下我們的編譯系統

#include 

int main()

hello程式的生命週期是從乙個高階語言c語言程式開始,因為這種形式能夠人讀懂。然而,為了在系統上執行hello.c程式,每條c語句都必須被其他程式轉化為一系列的低階機器語言指令。然後這些指令按照一種稱為可執行目標程式的格式打包好,並以二進位制磁碟檔案的形式存放起來。目標程式也稱為可執行目標檔案

在linux系統上,從原始檔到目標檔案的轉化是由編譯器驅動程式完成的:

linux> gcc -o hello hello.c
在這裡,gcc編譯器驅動程式讀取源程式檔案hello.c,並把它翻譯成為乙個可執行目標檔案hello。這個翻譯過程可分為四個階段完成,稱為編譯系統、如下圖。 

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

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

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

請注意:hello程式呼叫了乙個printf函式,它是每個c編譯器都會提供的標準c庫中的乙個函式,printf函式存在於乙個名為printf.o的單獨預編譯好了的標準檔案中,而這個檔案必須以某種方式合併到我們的hello.o程式中,鏈結器(ld)就負責處理這種合併,結果就得到hello檔案,他是乙個可執行目標檔案(簡稱:可執行檔案),可以被載入到記憶體中,有系統執行。

gcc 預處理(預編譯),編譯,彙編,鏈結

一,預編譯 操作步驟 gcc e hello.c o hello.i 主要作用 處理關於 的指令 刪除 define,展開所有巨集定義。例 define portnumber 3333 處理條件預編譯 if,ifdef,if,elif,endif 處理 include 預編譯指令,將包含的 h 檔案...

gcc 預處理(預編譯),編譯,彙編,鏈結

一,預編譯 操作步驟 gcc e hello.c o hello.i 主要作用 處理關於 的指令 刪除 define,展開所有巨集定義。例 define portnumber 3333 處理條件預編譯 if,ifdef,if,elif,endif 處理 include 預編譯指令,將包含的 h 檔案...

GCC編譯過程(預處理 編譯 彙編 鏈結)

gcc編譯過程 預處理 編譯 彙編 鏈結 這裡gcc編譯器 是指在linux類作業系統下,windows編譯器 mingw 相當於windows版gcc 乙個c c 檔案要經過預處理 preprocessing 編譯 compilation 彙編 assembly 和鏈結 linking 等4步才能...