1. 程式人生 > >GCC編譯過程回顧

GCC編譯過程回顧

最近在查詢有關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並非是編譯器,它是一系列的編譯程式套件,它類似於一個介面我們輸入一些指令去讓他呼叫相應的編譯器。

參考的文章:

https://blog.csdn.net/gt1025814447/article/details/80442673