可執行檔案生成過程概述
阿新 • • 發佈:2019-02-04
- 處理原始檔中以“#”開頭的預編譯指令,包括:
- 刪除“#define”並展開所定義的巨集
- 處理所有條件預編譯指令,如:“#if”,“#ifdef”,”endif”等
- 插入標頭檔案到“#include”處,可以遞迴方式進行處理
- 刪除所有的註釋“//”和“/**/”
- 新增行號和檔名標識,以便編譯時編譯器產生除錯用的行號資訊
- 保留所有“#pragma”編譯指令(編譯器需要使用)
編譯 - 編譯過程就是將預處理後得到的預處理檔案(如hello.i)進行詞法分析,語法分析,語義分析並優化,生成彙編程式碼檔案
- 用來進行編譯處理的程式稱為編譯程式(編譯器,Complier)
編譯命令
-`$gcc -S hello.i -o hello.s經過編譯後,得到的彙編程式碼檔案(如hello.s)還是可讀的文字檔案,CPU無法理解和執行它
gcc命令實際上是具體程式(如ccp,ccl,as等)的包裝命令,使用者通過gcc命令來使用具體的預處理程式cpp,編譯程式ccl和彙編程式as等
彙編
- 彙編程式碼檔案(由彙編指令構成)稱為組合語言源程式
- 彙編程式(彙編器)用來將組合語言源程式轉換為機器指令序列(機器語言程式)
- 彙編指令和機器指令一一對應,前者是後者的符號表示,他們都屬於機器級指令,所構成的程式稱為機器級程式碼
彙編命令
-$gcc -c hello.s -o hello.o
彙編結果是一個可重定位的目標檔案(如 ,hello.o),其中包含的是不可讀的二進位制程式碼,必須用相應的工具軟體來檢視其內容
連結
預處理,編譯和彙編三個階段針對一個模組(一個.c檔案),進行處理得到對應的一個可重定位目標檔案(一個.o檔案)
- 連結過程將多個可重定位目標檔案合併以生成可執行目標檔案