預處理,編譯,彙編和鏈結

2021-08-22 14:42:14 字數 943 閱讀 8465

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.編譯預處...