1、預編譯
gcc -E hello.c -o hello.i
源代碼文件hello.c和相關的頭文件(如stdio.h),被【預編譯器(cpp)】預編譯成一個.i文件;
預編譯過程,主要處理那些源代碼中的,以#開頭的預編譯指令;
如 :展開所有的宏定義(#define),
處理所有的條件預編譯指令(#if,#ifdef,#else,#endif等),
將被包含的文件插入到預編譯指令所在位置(#include),
去除所有的註釋行(//,/* */),
添加行號和文件名標識,
保留所有的編譯器指令(#program),
經過預編譯後的.i文件,不包含任何宏定義。
2、編譯
gcc -S hello.i -o hello.s
對預編譯後的文件,進行一系列的詞法分析,語法分析,語義分析和優化,產生相應的彙編代碼文件;
3、彙編
as hello.s -o hello.o 或 gcc -c hello.s -o hello.o
彙編過程,將彙編代碼轉換爲機器可以執行的指令,每一條彙編指令幾乎都會對應一條機器指令;
4、鏈接
鏈接過程,處理各個模塊之間的相互引用,使各個模塊之間能夠正確銜接起來;
包括:地址和控件分配,符號決議和重定位等;
鏈接過程,本質上是就是一個模塊拼裝過程;