Linux C 編譯鏈結過程

2021-10-12 17:18:59 字數 1043 閱讀 8124

我們平時說的編譯器實質上指的是編譯工具鏈。預處理用預處理器,彙編用彙編器,鏈結用鏈結器,這幾個工具再加上其他一些額外會用到的工具,合起來叫編譯工具鏈。gcc就是乙個編譯工具鏈。

寫乙個c源**hello.c

預處理:預處理器將#include在原地展開,所以標頭檔案包含一般放在程式檔案的最前面部分。

編譯:編譯器將hello.i翻譯成hello.s彙編檔案,匯程式設計序是一條條通用的機器語言指令。

彙編:彙編器將hello.s翻譯成機器語言指令,將這些指令打包成為***.o格式的可重定位檔案,並將結果儲存在目標檔案hello.o中。

/* 預處理命令 */

gcc -e hello.c -o hello.i

/* 編譯 */

gcc -s hello.i -o hello.s

/* 彙編 */

gcc -c hello.s -o hello.o

/* 鏈結 */

下面放上各個檔案的截圖。

常見的預處理命令:檔案包含,巨集定義和條件編譯參考之前的文章【c語言】程式結構。

編譯鏈結過程

在談編譯鏈結過程之前我們需要了解一下虛擬位址空間以及程式在編譯鏈結過程時經過了什麼步驟。虛擬位址空間之前在程序空間的部落格中詳細介紹過了,詳見 上圖就是32位系統中4g虛擬位址空間的分布情況 text 段 指令段,存放的是指令 在程式中,我們把區域性變數定義 區域性變數的 定義是指令而不是資料 還有...

編譯鏈結過程(一)

什麼是編譯?什麼是鏈結?為什麼需要編譯和鏈結?在很久以前,計算機發展的初期,還在用機器語言編寫程式,量比較少時是不需要編譯和鏈結的。因為當時的程式設計師直接編寫機器碼讓計算機執行。每種cpu的指令是不相同的,所以每乙個程式要換一台不同cpu的機器上執行時,需要重新寫程式,而且機器語言 涉及很多計算機...

編譯鏈結過程(二)

前一篇博文提到編譯的幾個步驟,這一篇來了解下具體每一步都幹了些什麼,好叫心裡有數。詳細的過程,我想只有通過分析乙個具體的編譯器 才好。下面介紹的幾個步驟完成了原始碼檔案經過編譯鏈結後成為可執行檔案 預編譯後的檔案,不再包含注釋,標頭檔案也插入進來,條件編譯也得到相應的處理。那麼,剩下的就是實實在在的...