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.語...