1、我們有乙個hello.c檔案,用最簡單的命令gcc hello.c 生成 a.out 這個過程可以分為四個步驟:預處理(prepressing)、編譯(compilation)、彙編(assembly)和鏈結(linking)。
一、預編譯
1.將所有的#define刪除,並展開所有的巨集定義;
2.處理所有的預編譯指令,例如:#if,#elif,#else,#endif;
3.處理#include預編譯指令,將被包含的檔案插入到預編譯指令的位置;
4.新增行號資訊檔名資訊,便於除錯;
5.刪除所有的注釋:// /**/;
6.保留所有的#pragma編譯指令,因為在編寫程式的時候,我們經常要用到#pragma指令來設定編譯器的狀態或者是指示編譯器完成一些特定的動作。
gcc -e hello.c -o hello.i
二、編譯
編譯主要是將高階語言生成組合語言
1.掃瞄,語法分析,語義分析,源**優化,目標**生成,目標**優化;
2.生成彙編**;
3.彙總符號;
4.生成.s檔案
gcc -s hello.i -o hello.s
三、彙編
彙編過程是將組合語言轉變為機器可以執行的機器語言,每個彙編語句幾乎對應著一條機器指令。
1.根據彙編指令和特定平台,把彙編指令翻譯成二進位制形式;
2.合併各個section,合併符號表;
3.生成.o目標檔案。
gcc -c hello.s -o hello.o
四、鏈結
1.合併各個.obj檔案的section,合併符號表,進行符號解析;
2.符號位址重定位;
3.生成可執行檔案。
預處理 編譯 彙編 鏈結
1.預處理 預處理器 預處理階段主要處理 include 和 define 它把 include包含進來的 h 檔案插入到 include 所在的位置,把源程式中使用到的用 define 定義的巨集用實際的字串代替。2.編譯階段 編譯器 在這個階段,編譯器先要檢查 的規範性和語法錯誤等,以確定 的實...
預處理,編譯, 優化, 彙編, 鏈結
編譯,編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。c源程式標頭檔案 預編譯處理 cpp 編譯程式本身 優化程式 匯程式設計序 鏈結程式 可執行檔案 1.編譯預處理讀...
預處理,編譯, 優化, 彙編, 鏈結
編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言 目標檔案 並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。c源程式標頭檔案 預編譯處理 cpp 編譯程式本身 優化程式 匯程式設計序 鏈結程式 可執行檔案 1.編譯預處...