GCC編譯過程回顧
阿新 • • 發佈:2018-12-31
最近在查詢有關Makefile的資料的時候又複習了一遍gcc編譯的過程。
1.預編譯
gcc -E hello.c -o hello.i
cpp hello.c > hello.i
- 巨集定義的處理 #define #ifndef #endif等
- 處理#include後面檔案的包含
- 忽略掉所有的註釋
- 新增行號和檔案名錶示用於報錯時候的提醒
- 保留#program編譯器指令
2.編譯
gcc -S hello.i -o hello.s
- 將預處理之後的檔案進行語法分析、詞法分析以及語義分析、優化等。
- 生成彙編程式碼檔案。構建中最複雜的一部,區別編譯器好壞的一步。
3.彙編
gcc -c hello.s -o hello.o 或者 as hello.s -o hello.o
彙編是指第二步生成的彙編程式碼變成機器可以執行的指令
4.連結 (Link)
連線的過程就是連結動態庫和靜態庫的過程
生成的目標檔案.o與可執行檔案之間的區別?
目標檔案就是最後彙編之後生成的檔案,但是少了連結的那一步·,其實它與可執行檔案的內容大致是一致的,所以都被廣義的歸為一類檔案,也就是ELF檔案,都是按照ELF檔案格式儲存的
LINUX下的ELF檔案型別
.o檔案、可執行檔案、核心轉儲檔案(core dump)、.so檔案(動態鏈連結庫)
gcc作用
其實gcc並非是編譯器,它是一系列的編譯程式套件,它類似於一個介面我們輸入一些指令去讓他呼叫相應的編譯器。
參考的文章: