有人或許會有疑問,編輯器裏面的代碼是怎樣變成可執行文件的?今天在這裏總結一下文件的編譯鏈接過程。
首先看一下編譯與鏈接的定義。所謂編譯,就是把高級編程語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序會把人們所熟悉的高級編程語言換成機器可以識別的2進制的機器語言,這樣的轉換過程就叫編譯。所謂鏈接, 就是把目標文件、代碼中用到的庫文件和操作系統中的代碼文件合併,組織起來轉換成二進制的可執行文件,其間的轉換過程稱之爲鏈接。
編譯的過程主要分爲三個階段, 如圖所示,
預編譯的主要任務是:(1)處理預編譯指令;(2)將文件中的註釋清除 編譯的主要任務是:(1)生成符號表;(2)生成彙編指令;(3)彙總數據 彙編的主要任務是:將彙編指令彙總,然後轉換成二進制文件
鏈接的過程比較簡單,就是將編譯過程中生成的二進制可重定位文件和一些庫文件進行組合,轉換爲二進制的可執行文件。
鏈接的主要意義是:(1)合併段表;(2)調整段偏移;(3)合併符號表;(4)完成符號的重定位。
二進制可執行文件的信息會按照頁讀入到4G虛擬地址空間中,其中相同屬性的段放在一個頁。而我們在虛擬地址空間圖中按照段來劃分只是爲了更清晰的觀察,起始真正的是按照頁進行存儲的。那麼有多少個頁可以存放呢?每一個頁存放的是什麼數據呢?這個在二進制可執行文件中有明確的標誌,在二進制可執行文件的詳細信息中有LOAD頁標誌,就是用來告訴虛擬地址空間哪些段存放在一個頁中的。
源文件最終經過編譯鏈接之後會生成指令和數據,指令存放在4G虛擬地址空間的.text段,數據存放在.data和.bss段。.data段存放的是初始化且初始化值不爲零的數據,.bss段存放初始化值爲0或者沒有初始化的數據。
其實直接訪問內存、常用部分和高端內存加起來是略大於內核空間的,是大於1G的文件映射。
至於二進制可重定位文件與二進制可執行文件的結構,我在前期的總結中已經寫過,這裏就不再重複總結了。