程序虛擬地址空間 程式編譯連結過程
阿新 • • 發佈:2019-02-15
1..程式編譯、連結、執行的過程。
(1)預編譯階段****
生成*.i檔案。
處理原始碼檔案,即以“#”開始的預編譯指令。
有展開巨集;去註釋;新增行號;保留所有#pragma編譯指令。
(2)編譯階段**
生成*.s檔案
詞法分析:源程式被輸入到掃描器,掃描器將原始碼的字元序列分割成一系列的記號(識別符號、關鍵字、字面量(數字、字串等))。在識別幾號的同時,掃描器也完成了其他工作,比如將識別符號存放到符號表。
語法分析:語法分析器產生語法樹(以表示式為節點)。
語義分析:整個表示式被標識了型別
中間語言的生成:使得編譯器分為前端和後端。前端負責產生機器無關中間程式碼,後端將中間程式碼轉換成目標機器程式碼。
目的碼的生成與優化:接近機器可以執行。
(3)彙編
生成可重定位的目標檔案(.obj(windows) .o(Linux))
其中有符號表段。
根據對應關係 將彙編指令=》本地作業系統機器碼(彙編器執行)。
(4)連結
生成可執行檔案
.exe(windows)
.elf(Linux下)
分為兩步
【1】所有.o檔案段進行合併,其中包含合併符號表。此時要進行【符號解析】,解析正確,給符號表符號分配【虛擬地址】。
符號解析:未定義的符號找到其定義的地方。
【2】進行【符號重地位】。
符號重地位:指定中的無效地址替換成正確的虛擬地址。
2.程序的虛擬地址空間
程序在記憶體上的佈局 虛擬地址空間
.data 儲存已經初始化的全域性靜態變數和區域性靜態變數
.rodata存放只讀資料.
.bss 存放未初始化全域性變數和區域性靜態變數
.text 存放程式碼段
3.IA32體系·虛擬地址的對映
* *IA32體系虛擬地址對映圖解**