Linux 六 編譯鏈結原理

2021-10-24 12:12:37 字數 1724 閱讀 8012

一、編譯鏈結原理

我們編譯乙個程式的過程,其實是由四個步驟組成的,分別是:預編譯、編譯、彙編、鏈結。雖然我們現在都是在ide這種整合開發環境下進行產品的開發,平時也不需要關注程式到底是怎麼進行編譯鏈結的,但了解編譯鏈結原理對我們學習程式設計,以及對我們編寫程式有很大幫助,因此,我們十分有必要學習程式的編譯鏈結原理。接下來,我們就從四個步驟開始入手學習。

1、預編譯階段

預編譯階段主要處理那些源**中以「#」開頭的預編譯指令,具體如下:

(1)處理「#include」預編譯指令,將被包含的檔案插入到該預編譯指令的位置。注意:該過程是遞迴的,也就是說,被包含的檔案可能還包含其他檔案。

(2)處理所有條件預編譯指令,比如「#if",「#ifdef」,"#else",「#endif」。

(3) 進行巨集替換,並將所有的「#define」刪除。

(4)刪除注釋,包括「//」和「/…/」

(5)新增行號和檔名標識,以便於編譯時編譯器產生除錯用的行號資訊以及產生編譯錯誤或警告時能夠顯示行號。

(6)保留所有的「#pragma」編譯指令,因為編譯器要使用它們。

2、編譯階段

(1)進行一系列詞法分析、語法分析和語義分析

(2)進行**的優化

(3)彙總符號、資料和函式

這個過程是整個程式構建的核心部分,也是最複雜的過程之一。

3、彙編階段

(1)將彙編指令翻譯成二進位制的機器指令

(2)生成各個段(section)

(3)生成符號表

4、鏈結階段

(1)合併所有檔案的各個section,調整段大小以及段的起始位置。

(2)合併符號表,進行符號解析,並給符號分配乙個虛擬位址。

(3)進行符號重定位,在源**中使用符號的地方全都替換成符號的虛擬位址。

每乙個步驟都會生成乙個中間檔案,下面就以乙個.c檔案為例,說明此過程。

二、可執行檔案格式

現在流行的可執行檔案格式主要是windows下的pe(portable executable)和linux下的elf(executble linkable format),它們都是coff(common file format)格式的變種。

目標檔案就是源**進行編譯後但未鏈結的那些中間檔案(windows下的.obj檔案和linux下的.o檔案),它跟可執行檔案的內容和結構很相似,所以跟可執行檔案採用相同的檔案格式儲存。

在linux下,可以通過objdump和readelf命令檢視檔案的內部資訊。

示例:檢視各個段資訊

(1)目標檔案

目標檔案:

編譯鏈結原理

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

編譯鏈結原理

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

編譯鏈結原理

32位計算機,每個程式都有4g的虛擬位址空間。首先虛擬位址空間分為兩大塊,乙個是使用者空間,乙個是核心空間。使用者空間佔3g的大小,並且它是每個程序所獨有的,它的開頭128m存放的是我們無法訪問的地方。text c語言的編譯後執行語句都編譯成機器 儲存在.text段 data 已初始化的全域性變數和...