天天看點

《編譯與反編譯技術實戰》——1.4 編譯器GCC

本節書摘來自華章計算機《編譯與反編譯技術實戰》一書中的第1章,第1.4節,作者 劉曉楠 陶紅偉 嶽峰 戴超,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

gcc(gnu compiler collection,gnu編譯器套件)是由gnu開發的程式設計語言編譯器。它是以gpl許可證發行的自由軟體,也是 gnu計劃的關鍵部分。gcc原本作為gnu作業系統的官方編譯器,現已被大多數類unix作業系統(如linux、bsd、mac os x等)采納為标準的編譯器,gcc同樣适用于微軟的windows。

gcc 原名為 gnu c 語言編譯器(gnu c compiler),因為它原本隻能處理 c語言。随着gcc的快速擴充,其可支援c++,後來又能夠支援更多程式設計語言,如fortran、pascal、objective-c、java、ada、go以及各類處理器架構上的彙編語言等,是以改名為gnu編譯器套件。

(1)前端接口

前端将進階語言源碼經過詞法分析、文法分析生成與進階語言無關的低級中間層表示generic,然後經過單一化指派轉化為另一種中間表示層gimple,在中間層gimple組建控制流程圖,并在gimple上進行一系列優化。然後将其轉換為更加便于優化的rtl中間表示層。有了與前端無關的中間表示,gcc的前端将不同的進階程式設計語言轉換成這種中間表示,這就是gcc處理器支援多種程式設計語言的根本原因。

(2)中間接口

中間接口主要在rtl中間表示上進行各種優化,gcc的優化技巧根據版本不同而有很大不同,但都包含了标準的優化算法,如循環優化、公共子表達式删除、指令重排序等。更多的優化方法也在不斷地研究中。

(3)後端接口

gcc後端對每條rtl通過模闆比對的方法調用對應的彙編模闆生成彙編代碼。生成的代碼因處理器和結構不同而不同,gcc後端為不同的平台提供了描述指令的彙編模闆檔案,這樣就可以實作對不同平台的支援。這個階段非常複雜,因為必須要考慮gcc可移植平台的處理器指令集的規格與技術細節,解決指令選擇和寄存器配置設定等問題。

(4)gcc常用的參數

在使用gcc編譯器的時候,必須給出一系列必要的調用參數和檔案名稱。gcc編譯器的調用參數大約有100多個,這裡隻介紹其中最基本、最常用的參數。具體細節内容可參考gcc manual。

gcc最基本的用法是:

其中options就是編譯器所需要的參數(也稱為編譯選項),filenames給出相關的檔案名稱。

-c:隻編譯,不連結成為可執行檔案,編譯器隻是由輸入的.c等源代碼檔案生成以.o為字尾的目标檔案,通常用于編譯不包含主程式的子程式檔案。

-o output_filename:确定輸出檔案的名稱為output_filename,同時這個名稱不能與源檔案同名。如果不給出這個選項,gcc就給出預設的可執行檔案a.out。

-g:産生符号調試工具(gnu的gdb)所必要的符号資訊,要想對源代碼進行調試,必須加入這個選項。

-o:對程式進行優化編譯、連結。采用這個選項,整個源代碼會在編譯、連結過程中進行優化處理,這樣産生的可執行檔案的執行效率可以提高,但是編譯、連結的速度相應地要慢一些。

-o2:比-o更好的優化編譯、連結,當然整個編譯、連結過程會更慢。

-v:gcc執行時執行的詳細過程、gcc及其相關程式的版本号。編譯程式時加上該選項可以看到gcc搜尋頭檔案/庫檔案時使用的搜尋路徑。

繼續閱讀