compile流程
compiler 在 compile 程式的流程:
1. preprocessing
2. compilation
3. assembly
4. linking
preprocessing 即將 #define 刪除,展開所有巨集。將所有 #include 的檔案插入。處理 #if/#ifdef 等的 conditional 指令。刪除所有註解。添加行號。preprocessing 完後會產生 .i 檔。gcc -E 可以產生 .i 檔。
compilation 則會做程式的 scanning,將程式分為幾個 token;然後再做 grammar 及 semantic 的分析。compilation 完後即會產生組合語言碼 .s 檔。gcc -S 可以由 .c 檔直接產生 .s 檔。
assembly 則是將 .s 檔 "組合" 成機器語言,也就是 object file。由於每一個組合語言指令大概都對應到一個機器碼,因此這部較簡單。在 gcc 中,這部份實際上是由 as 來做的。
linking 則是將程式所有會用到的 .o 檔做連結。由於 .o 檔是個別編譯的,因此在 .o 檔中並沒有參考到其它 .o 檔變數或函式的真正位址。linker 的目的除了連結所有 .o 檔,也會計算出每個變數或函式的真正位址,然後將所有參考到這些變數或函式的地方填上這個位址。這個動作就叫做 relocation。linking 完後最後就會產生執行檔。在 gcc 中是使用 ld 來做 linking 動作。
留言
張貼留言