Chapter 4. GNU Compiler Collection

Table of Contents
簡介
重要的選項或旗標(FLAGS)
標頭檔 函式庫與gcc
gcc與Obj檔,動態連結與ELF檔
gcc與OS - User space/Kernel space
binutils
結語

簡介

GCC Gnu Compiler Collection(GCC),應該是GNU最有名的傑作了。很多研 究單位不想多花錢買商用的compiler就用gcc來compile。本來gcc的意思是 專指gnu c compiler,不過後來延伸出pascal,fortran等等只要是GNU負責的 都是,不過我們還是指有c/c++/object c 的gnu compiler package 。他的功能跟強大不是一般compiler比得上的。

它可以是個cross-compiler,也就是它可以在Intel的機器上編譯程式,但是這 個程式是Sun Sparc Solaris的執行檔,反之也可以,只要他有支援的機器,作 業系統,就可這樣亂七八糟的愛怎麼編就怎麼編。現在最流行的就是arm這顆 CPU,或者palm的程式寫作,用gcc實在是太好用了。

而且這個編譯器是免費的,不要說怎麼這麼陽春,沒有IDE,基本上寫作大程式, 是沒有這些東西的,寫程式寫到好幾萬行時,那些已經沒有一個清醒的頭 腦重要了。因此要會真正的C功力,要寫真正有用的程式,非gcc莫屬了。 這是一個免費的練習的好軟體。

一個編譯過程通常需要4道程序

  1. preprocess 先處理那些#ifdef #define這些東西並做一些巨集代換

  2. compile 做語意分析,翻譯成組合語言

  3. assemble 翻成機器碼與OS有關的格式,做成relocatable obj檔。

  4. link 找到symbol(函式,變數名)與程式庫(shared obj)中的副程式 ,做成可執行obj檔(executable obj)。

分別由cpp,cc1,as,ld來完成。但我們通常用個
$ gcc xxx.c
      
就好了,這是因為 gcc或者g++只是個編譯驅動器(compiler driver),這個驅動器去叫cpp這些 工具來完成編譯過程中所需要的步驟。其中as, ld這些工具又放在另一個 package叫binutil的裡面,所以要裝好gcc,不僅要gcc的套件最好連binutil 這個套件都要小心。另外更重要的是函式庫的版本與kernel的版本(安裝gcc要小 心很多東西,像gpref也要更新成有support)