天天看點

GCC 編譯器原理

l  全稱為GNU CC ,GNU項目 中符合中符合ANSI C标準的标準的編譯系統

l  編譯如編譯如CC、C++C++、ObjObject CC、JJ ava、FFortran、PPascall、

Modula-3和Ada等多種語言

l  GCCGCC是可以為多種硬體平台上編譯出可執行程式的超級編是可以為多種硬體平台上編譯出可執行程式的超級編譯器,其執行效率與一般的編譯器相比平均效率要高

20%~30%

l  一個交叉平台編譯器 ,适合在嵌入式領域的開發編譯

GCC編譯器的版本

l  GNU Compiler Collection

l  C, C++, Objective-C, Fortran, Java, Ada GCC 4.3.1 

l  http://gcc.gnu.org  

GCC 4.3.0  Mar55, 2008
GCC 3.3 May 13, 2003 
GCC 3.2 August 14, 2002
GCC3.0 June 18, 2001
GCC 2.95 July 31, 1999

GCC簡介

gcc所支援字尾名解釋所支援字尾名解釋

     .c                     C原始程式

     .C/.cc/.cxx            C++原始程式

     .m                     Objjective-C原原始程式程式

     .i            已經過預處理的C原始程式

     .iiii                   已經過預處理的已經過預處理的C++C++原始程式原始程式

     .s/.S         彙編語言原始程式

     .hh                    預處理檔案預處理檔案((頭檔案頭檔案))

     .o                     目标檔案

     .a//.so       編譯後的庫檔案編譯後的庫檔案

編譯器的作用

          源代碼*.c                                      GCC的編譯流程

分為四個步驟:

          預處理器     頭檔案*.h                         1.   預處理(Pre-Processing) 

2.編譯(Compiling)                                                  3. 彙編(Assembling)    

          編譯器                                                        4. 連結連結(Li(Linkiking))  

          引導代碼引導代碼

          目标代碼*.o

庫庫函數數

連結

可執行檔案

編譯器的主要元件

l  分析器:分析分析器将将源語言言程式代序代碼轉換為轉換為彙編語言言。因

    為要從一種格式轉換為另一種格式(C到彙編),是以

    分析器需要知道目标機器的彙編語言分析器需要知道目标機器的彙編語言。

l   彙編器:彙編器将彙編語言代碼轉換為CPU可以執行字

    節碼節碼。

l   連結器 :連結器将彙編器生成的單獨的目标檔案組合成

    可執行的應用程式可執行的應用程式。連結器需要知道這種目标格式以便連結器需要知道這種目标格式以便 工作。

l  标準标準C庫:核心的核心的CC函數都有函數都有一個主要的個主要的CC庫來提供庫來提供。如果在應用程式中用到了C庫中的函數,這個庫就會通過

連結器和源代碼連接配接來連結器和源代碼連接配接來生成最終的可執行程式成最終的可執行程式。

GCC的執行過程

l  調用cpp 進行預處理進行預處理,對源代碼檔案中的檔案對源代碼檔案中的檔案

包含(include)、預編譯語句(如宏定義define等) 進行分析;

l  調用cc1進行編譯,生成.o為字尾的目标檔案;

l  調用as進行彙編,彙編語言檔案經過預編譯和彙編之後都生成以.o為字尾的目标檔案;

調用ld進行連結,所有的目标檔案被安排在可執行程式中的恰當的位置執行程式中的恰當的位置。同時該程式所調程式用到的庫函數也從各自所在的檔案庫中連結到合适的地方。

“hello”的演變曆程

從左到右邊

hello.c                    hello.i                   hello.s                     hello.o                   hello 

(text)                     (text)                    (text)                      (binary)                  (binary) 

          PrePre‐processor  Compiler  Assembler  Linker 

                                                                 printfprintf.oo 

 (binary) 

          (cpp /                     (cc1 /                     (as /                       (ld) 

          Gcc ‐E)                   Gcc ‐S)       Gcc‐c)                                                                           

繼續閱讀