程序虛擬位址空間 程式編譯鏈結過程

2021-08-18 02:42:09 字數 1246 閱讀 8051

1..程式編譯、鏈結、執行的過程。

(1)預編譯階段****

生成*.i檔案。

處理源**檔案,即以「#」開始的預編譯指令。

有展開巨集;去注釋;新增行號;保留所有#pragma編譯指令。

(2)編譯階段**

生成*.s檔案

詞法分析:源程式被輸入到掃瞄器,掃瞄器將源**的字串行分割成一系列的記號(識別符號、關鍵字、字面量(數字、字串等))。在識別幾號的同時,掃瞄器也完成了其他工作,比如將識別符號存放到符號表。

語法分析:語法分析器產生語法樹(以表示式為節點)。

語義分析:整個表示式被標識了型別

中間語言的生成:使得編譯器分為前端和後端。前端負責產生機器無關中間**,後端將中間**轉換成目標機器**。

目標**的生成與優化:接近機器可以執行。

(3)彙編

生成可重定位的目標檔案(.obj(windows) .o(linux))

其中有符號表段。

根據對應關係 將彙編指令=》本地作業系統機器碼(彙編器執行)。

(4)鏈結

生成可執行檔案

.exe(windows)

.elf(linux下)

分為兩步

所有.o檔案段進行合併,其中包含合併符號表。此時要進行【符號解析】,解析正確,給符號表符號分配【虛擬位址】。

符號解析:未定義的符號找到其定義的地方。

進行【符號重地位】。

符號重地位:指定中的無效位址替換成正確的虛擬位址。

2.程序的虛擬位址空間

程序在記憶體上的布局 虛擬位址空間

.data 儲存已經初始化的全域性靜態變數和區域性靜態變數

.rodata存放唯讀資料.

.bss 存放未初始化全域性變數和區域性靜態變數

.text 存放**段

3.ia32體系·虛擬位址的對映

* *ia32體系虛擬位址對映****

C 虛擬位址空間與編譯鏈結原理

1.虛擬位址空間 程序位址空間需要隔離,防止惡意的程式修改其它程式的記憶體資料,因此計算機中引入虛擬位址空間。虛擬位址空間布局 text 段 可執行 唯讀變數 字串常量 data 資料段 已初始化且初值非0的全域性變數和靜態變數 全域性和區域性 bss 未初始化或初始值為0的全域性變數和靜態變數。如...

程序的虛擬位址空間

linux程序虛擬位址空間是linux記憶體管理的乙個重要部分。總的虛擬位址空間通常按3 1的比例劃分,其中1g分給核心,3g分給使用者。由低位址到高位址分別為 唯讀段 該部分空間 只能讀,不可寫 包括 段 rodata 段 c常量字串和 define定義的常量 資料段 儲存全域性變數 靜態變數 的...

程式編譯鏈結,執行原理,虛擬位址空間布局

1 預編譯過程 i 1.刪除 define文字替換 2.if endif elif 3.include遞迴展開 4.刪除注釋 5.新增行號 主要目的是為了方便除錯 6.保留 pragma 2 編譯 s 1.詞法分析 例 int 8a 10 變數不能以數字開頭 2.語法分析 根據一條表示式分析 3.語...