1. 程式人生 > >GCC編譯和連結過程

GCC編譯和連結過程

GCC(GNU Compiler Collection,GNU編譯器套件),是由 GNU 開發的程式語言編譯器。它是以GPL許可證所發行的自由軟體,也是 GNU計劃的關鍵部分。GCC原本作為GNU作業系統的官方編譯器,現已被大多數類Unix作業系統(如Linux、BSD、Mac OS X等)採納為標準的編譯器,GCC同樣適用於微軟的Windows。

 

一、原始碼

 

 

二、編譯過程

 

(1)預處理:

 

 預處理就是將要包含(include)的檔案插入原檔案中、將巨集定義展開、根據條件編譯命令選擇要使用的程式碼,最後將這些程式碼輸出到一個“.i”檔案中等待進一步處理。

結果:見檔案0617_Demo.i

 

 (2)編譯

 

 

 編譯就是把C/C++程式碼(比如上面的".i"檔案)“翻譯”成彙編程式碼。

結果:見檔案0617_Demo.s

 

 (3)彙編

 

 

 紅色箭頭處的relocatable表示可重定位,也即是可以和庫等依賴檔案連結。

彙編就是將第二步輸出的彙編程式碼翻譯成符合一定格式的機器程式碼,在Linux系統上一般表現位ELF目標檔案(OBJ檔案)。

結果:見檔案0617_Demo.o

 

 這個就是沒有連線的目的碼,也是01序列,需要使用二進位制檢視器如Hex Editor Neo等檢視。

 

(4)連結

 

 連結就是將彙編生成的OBJ檔案、系統庫的OBJ檔案、庫檔案連結起來,最終生成可以在特定平臺執行的可執行程式。如圖中紅色箭頭所示。

結果:見檔案0617_Demo

 

 總結:在編譯過程中。除非使用了"-c",“-S”,或"-E"選項(或者編譯錯誤阻止了完整的過程),否則統一完整連結步驟。

 

三、連結原理

gcc -c -o 0617_Demo.o 0617_Demo.c 不作最後一步連結,得到0617_Demo.o二進位制OBJ檔案

gcc -v -o 0617_Demo 0617_Demo.o 先看一下連結過程是怎樣的:

 

  

l  crt1.o、crti.o、crtbegin.o、crtend.o、crtn.o是gcc加入的系統標準啟動檔案,對於一般應用程式,這些啟動是必需的。

l  -lc:連結libc庫檔案,其中libc庫檔案中就實現了printf等函式。

 

 

 

 

 

GCC編譯和連結過程

 

GCC(GNU Compiler Collection,GNU編譯器套件),是由 GNU 開發的程式語言編譯器。它是以GPL許可證所發行的自由軟體,也是 GNU計劃的關鍵部分。GCC原本作為GNU作業系統的官方編譯器,現已被大多數類Unix作業系統(如Linux、BSD、Mac OS X等)採納為標準的編譯器,GCC同樣適用於微軟的Windows。

 

一、原始碼

 

二、編譯過程

(1)預處理:

預處理就是將要包含(include)的檔案插入原檔案中、將巨集定義展開、根據條件編譯命令選擇要使用的程式碼,最後將這些程式碼輸出到一個“.i”檔案中等待進一步處理。

結果:見檔案0617_Demo.i

 

(2)編譯

編譯就是把C/C++程式碼(比如上面的".i"檔案)“翻譯”成彙編程式碼。

結果:見檔案0617_Demo.s

 

(3)彙編

紅色箭頭處的relocatable表示可重定位,也即是可以和庫等依賴檔案連結。

彙編就是將第二步輸出的彙編程式碼翻譯成符合一定格式的機器程式碼,在Linux系統上一般表現位ELF目標檔案(OBJ檔案)。

結果:見檔案0617_Demo.o

這個就是沒有連線的目的碼,也是01序列,需要使用二進位制檢視器如Hex Editor Neo等檢視。

 

(4)連結

連結就是將彙編生成的OBJ檔案、系統庫的OBJ檔案、庫檔案連結起來,最終生成可以在特定平臺執行的可執行程式。如圖中紅色箭頭所示。

結果:見檔案0617_Demo

 

總結:在編譯過程中。除非使用了"-c",“-S”,或"-E"選項(或者編譯錯誤阻止了完整的過程),否則統一完整連結步驟。

 

三、連結原理

gcc -c -o 0617_Demo.o 0617_Demo.c 不作最後一步連結,得到0617_Demo.o二進位制OBJ檔案

gcc -v -o 0617_Demo 0617_Demo.o 先看一下連結過程是怎樣的:

 

l  crt1.o、crti.o、crtbegin.o、crtend.o、crtn.o是gcc加入的系統標準啟動檔案,對於一般應用程式,這些啟動是必需的。

l  -lc:連結libc庫檔案,其中libc庫檔案中就實現了printf等函式。

&n