GCC編譯和鏈接過程
- 2020 年 6 月 27 日
- 筆記
- C / C++常見問題, linux
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等函數。