編譯鏈結原理

2021-08-31 21:27:21 字數 1165 閱讀 7321

32位計算機,每個程式都有4g的虛擬位址空間。首先虛擬位址空間分為兩大塊,乙個是使用者空間,乙個是核心空間。使用者空間佔3g的大小,並且它是每個程序所獨有的,它的開頭128m存放的是我們無法訪問的地方。

.text:c語言的編譯後執行語句都編譯成機器**,儲存在.text段;

.data:已初始化的全域性變數和區域性靜態變數都儲存在.data段;

.bss:為未初始化的全域性變數和區域性靜態變數預留值;

.棧:棧中存放我們的區域性變數,特性是先進後出,並且它是由系統自動開闢以及釋放。並且記憶體是連續的,棧是高位址向低位址擴充套件的連續記憶體,棧的大小一般是2m。

.c/.cpp檔案首先會進行預編譯,完成後生成(.i檔案):

具體內容:

(1)、#indefine巨集定義替換

(2)、#include展開標頭檔案(遞迴)

(3)、#if #endif 刪除預編譯指令

(4)、刪除注釋/*…*/

(5)、新增行號檔案標識

(6)、保留#progma

在預編譯完成之後,進行編譯,完成後生成(.s檔案):

具體內容:

(1)、詞法分析

(2)、語法分析

(3)、語義分析

(4)、**優化(生成指令**,彙編**)

在編譯完成之後,進行彙編,完成後生成(.o)檔案

具體內容:

(1)、指令**轉化成二進位制(可重定位的二進位制檔案)

具體內容:將有關的目標檔案彼此鏈結,也即將在乙個檔案中引用的符號同該符號在另外乙個檔案中的定義鏈結起來,是的所有的這些檔案成為乙個能夠讓作業系統裝入執行的統一整體,可分為動態鏈結和靜態鏈結,

(1)、合併段和符號表

(2)、符號解析

(3)、分配位址和空間

(4)、符號的重定位

強弱符號:

強符號:已初始化的全域性變數;

弱符號:未初始化的全域性變數;

強弱符號的規則:

1、兩個強符號,重定義

2、乙個強符號乙個弱符號,選強符號

3、兩個弱符號,選位元組長的

1、建立虛擬位址空間和物理記憶體的對映。

2、載入指令和資料。

3、第一行指令的位址寫入pc暫存器。

編譯鏈結原理

從源 到可執行程式,需要經歷以下幾個過程 預處理 編譯 彙編 連線。1.預處理 預處理主要是處理以 開頭的預編譯指令,包括 include define if等 刪除注釋 新增行號以及標頭檔案展開。2.編譯 編譯的主要工作是詞法分析 語法分析 優化編譯,將源 翻譯成彙編 3.彙編 彙編是將彙編 翻譯...

編譯鏈結原理

32位計算機,每個程式都有4g的虛擬位址空間。首先虛擬位址空間分為兩大塊,乙個是使用者空間,乙個是核心空間。使用者空間佔3g的大小,並且它是每個程序所獨有的,它的開頭128m存放的是我們無法訪問的地方。1 預編譯 生成 i 檔案 操作命令 gcc e main.c o main.i 具體內容 1 巨...

編譯鏈結原理

1.預編譯階段 生成.i檔案 1 刪除 define,並展開所有的巨集進行文字替換 2 遞迴展開 include 3 處理所有條件預編譯指令,如 if endif ifdel等 4 刪除注釋 5 新增行號和檔名標識 6 保留所有的 pragma編譯器指令,待編譯器使用 2.編譯階段 生成.s檔案 把...