GCC 內部結構主要由 Binutils、gcc-core、Glibc 等軟體包組成。
1. Binutils:它是一組開發工具,包括連接器,彙編器和其他用於目標文件和檔案的工具。關於 Binutils 的介紹可以參考 Binutils 簡單介紹。這個軟體包依賴於不同的目標機的平臺。因為不同目標機的指令集是不一樣的,比如 arm 跟 x86 就不一樣。
2. gcc-core:顧明之意是 GCC 的核心部分,這部分是只包含 c 的編譯器及公共部分,而對其他語言(C++、Ada 等)的支持包需要另外安裝,這也是 GCC 為何如此強大的重要原因 。gcc-core依賴於 Binutils。
3. Glibc:包含了主要的 c 庫,這個庫提供了基本的例程,用於分配內存,搜索目錄,讀寫文件,字符串處理等等。kernel 和 bootloader不需要這個庫的支持。
舉例描述下上面 3 個包是如何進行運作的。有一個 c 源文件 test.c 源碼如下:
1. #include<stdio.h>
2. int main(int argc, char *argv[])
3. {
4. printf("Hello Linux!!\n");
5. return 0;
6. }
編譯命令為: gcc -o test test.c 編譯生成 test 可執行文件。gcc 編譯流程分為四個步驟:預處理、編譯 、彙編、連結。預處理和編譯主要由 gcc-core 來完成,彙編和連結主要由 Binutils 來完成。那麼何時用到 glibc 呢?看到源碼中的 printf 函數沒有,這個函數在 GCC 中是以庫函數的形式存在,這個庫函數在 glibc 庫中,在 stdio.h 頭文件中被聲明。
總的來說,如果真正了解了上面 3 個軟體包的作用,自然就明白 GCC 是如何工作的。