從源**到可執行程式,需要經歷以下幾個過程:預處理、編譯、彙編、連線。
1.預處理
預處理主要是處理以"#"開頭的預編譯指令,包括#include、#define、#if等;刪除注釋、新增行號以及標頭檔案展開。
2.編譯
編譯的主要工作是詞法分析、語法分析、優化編譯,將源**翻譯成彙編**。
3.彙編
彙編是將彙編**翻譯成可重定位目標檔案。
4.鏈結
鏈結是將各種**和資料部分收集起來並組合成為乙個單一檔案的過程,這個檔案是可以被載入到記憶體中執行的。鏈結可以執行於編譯時,也就是在源**生成機器碼的時候;也可以執行於載入時,也就是在程式被載入器(loader)載入到儲存器並執行時;還可以執行於執行時,由應用程式來執行。也就是說,載入可以在三種情況下完成,一是在編譯時由靜態編譯器來完成(靜態鏈結);二是在載入時完成;三是在執行時由動態鏈結器來完成(動態鏈結)。
將外部函式的**(通常字尾名為.lib和.a檔案)新增到可執行檔案的過程,稱之為靜態鏈結。在程式執行時,將外部函式的**載入進來的過程,稱之為動態鏈結。靜態鏈結的好處是適用範圍廣,不用擔心缺少某個庫檔案,缺點是可執行檔案比較大,不能共享庫。動態鏈結的好處是可執行檔案可以比較小,多個應用程式可以共享庫檔案,不足之處是需要事先安裝好的庫檔案。
我們假設可執行檔案由main.c和swap.c兩個原始檔生成,編譯鏈結的過程如下圖所示:
其中圖中演示的是靜態鏈結的過程,靜態鏈結是一組可重定位目標檔案和命令列引數作為輸入,生成乙個完全可執行的檔案。
編譯鏈結原理
32位計算機,每個程式都有4g的虛擬位址空間。首先虛擬位址空間分為兩大塊,乙個是使用者空間,乙個是核心空間。使用者空間佔3g的大小,並且它是每個程序所獨有的,它的開頭128m存放的是我們無法訪問的地方。1 預編譯 生成 i 檔案 操作命令 gcc e main.c o main.i 具體內容 1 巨...
編譯鏈結原理
32位計算機,每個程式都有4g的虛擬位址空間。首先虛擬位址空間分為兩大塊,乙個是使用者空間,乙個是核心空間。使用者空間佔3g的大小,並且它是每個程序所獨有的,它的開頭128m存放的是我們無法訪問的地方。text c語言的編譯後執行語句都編譯成機器 儲存在.text段 data 已初始化的全域性變數和...
編譯鏈結原理
1.預編譯階段 生成.i檔案 1 刪除 define,並展開所有的巨集進行文字替換 2 遞迴展開 include 3 處理所有條件預編譯指令,如 if endif ifdel等 4 刪除注釋 5 新增行號和檔名標識 6 保留所有的 pragma編譯器指令,待編譯器使用 2.編譯階段 生成.s檔案 把...