程式的編譯 鏈結 執行過程

2021-08-17 23:17:36 字數 1061 閱讀 7675

一、編譯過程:

第一步,預編譯,展開標頭檔案,進行巨集替換。

第二步,編譯,**優化(gcc -o1234),符號彙總。

第三步,彙編,根據對應關係,將彙編指令轉換為本地作業系統的機器碼。

第四步,生成可重定位的目標檔案(沒有位址),可重定位的目標檔案中包含符號表;

第一步,將所有的目標檔案的段進行合併,其中包括合併符號表,進行符號解析,解析正確,給符號表的符號分配虛擬位址。

第二步,將**段的指令進行符合重定向。

符號解析:將未定義的符號,找到其定義的地方。容易出現的錯誤:1、重定義

2、未定義。

問題:為什麼.o檔案不能執行?

沒有給.o檔案的符號表中的符號分配虛擬位址。

一、執行過程:

執行中的程式叫做程序,系統會給每個程序分配2^32 = 4g的虛擬位址空間,其中位址

0x08048000

—0xc0000000共3g

的使用者虛擬位址空間,使用者空間是私有的;

0xc0000000

—0xffffffff共1g

的核心虛擬位址空間,核心空間是共享的。

全域性變數初始化的放在.data段;全域性變數初始化為

0的或未初始化的放在

.bss

段。

例子:

兩個檔案的符號表:

編譯鏈結執行原理 編譯鏈結執行過程

乙個.c cpp源程式檔案要最後變成.exe windows 或者.out linux 可執行檔案,要經過編譯和鏈結過程。四個步驟 預編譯,編譯,彙編,連線 一 預編譯 處理以 開頭的預編譯指令,比如 include,define等,規則如下 1 刪除所有的 define,並展開所有的巨集替換 文字...

編譯鏈結執行原理

預編譯.i 刪除 define 文字替換 處理 include 遞迴展開 處理 if end if等預編譯指令 刪除注釋 新增行號和檔案標識 保留 pragma 編譯.s 1.詞法分析 2.語法分析 3.語義分析 4.優化 5.生成彙編指令 低階語言 以下是彙編指令的 int main 彙編.o 翻...

C 編譯鏈結執行原理

1.預編譯 生成.i檔案 1.將所有的 define 刪除,並且展開所有巨集 2.處理掉所有條件預編譯指令,如 if ifdef elif else endif 3.處理 include 指令,這是乙個遞迴過程 4.刪除所有的注釋 和 5.新增行號和檔名標識 6.保留所有的 pragma編譯器指令,...