【Linux】編譯,鏈接,裝載簡單梳理

簡單梳理爲了更快的記憶理解及傳達

一.編譯

1.1 編譯過程:

在這裏插入圖片描述
編譯產出文件:
在這裏插入圖片描述

1.2 ELF文件類型:

linux中有如下幾種ELF文件:
在這裏插入圖片描述
當然Android手機中的oat文件也是ELF文件。

編譯生成的可執行文件是ELF文件,ELF文件相關知識具體參考:https://blog.csdn.net/TaylorPotter/article/details/90247231

這裏簡單列兩個視圖:

1.2.1 鏈接視圖:

在這裏插入圖片描述
幾個常見section的作用:
text 段的佈局如下:
[.text]:程序代碼
[.rodata]:只讀數據
[.hash]:符號散列表
[.dynsym]:共享目標文件符號數據
[.dynstr]:共享目標文件符號名稱
[.plt]:過程鏈接表
[.rel.got]:G.O.T 重定位數據。

data 段佈局如下:
[.data]:全局的初始化變量
[.dynamic]:動態鏈接結構和對象
[.got.plt]:全局偏移表
[.bss]:全局未初始化變量

1.2.2 裝載/執行視圖:

在這裏插入圖片描述
看執行視圖最直接感受就是不同section具有一樣的屬性的,比如可讀可寫,會劃分到相同的segment中去往內存中裝載.

二.鏈接

2.1 鏈接過程:

在這裏插入圖片描述
1.靜態鏈接使用靜態庫,在編譯階段抽取靜態庫中的依賴的目標文件進行鏈接,最終可執行文件中是包含靜態庫中依賴的目標文件的.
2.動態鏈接使用動態庫,在裝載執行時系統發現所依賴的動態庫不在物理內存中便會產生缺頁錯誤,使用linker去加載動態庫至物理內存.當然也可以主動load 動態庫(dlopen等)

2.2 靜態鏈接:

在這裏插入圖片描述
1.靜態鏈接將所有需要的目標文件鏈接到最終的可執行文件中,爲了提高程序運行裝載效率,將相似section放在一起.

2.3 動態鏈接:

動態鏈接基本思想:把程序按照模塊拆分成各個相對獨立部分,在程序運行時纔將它們鏈接在一起形成一個完整的程序.

假設現在有兩個程序program1.o和program2.o,這兩者共用同一個庫lib.o,假設首先運行程序program1,系統首先加載program1.o,當系統發現program1.o中用到了lib.o,即program1.o依賴於lib.o,那麼系統接着加載lib.o,如果program1.o和lib.o還依賴於其他目標文件,則依次全部加載到內存中。當program2運行時,同樣的加載program2.o,然後發現program2.o依賴於lib.o,但是此時lib.o已經存在於內存中,這個時候就不再進行重新加載,而是將內存中已經存在的lib.o映射到program2的虛擬地址空間中,從而進行鏈接(這個鏈接過程和靜態鏈接類似)形成可執行程序。

在這裏插入圖片描述
動態鏈接最關鍵通過got表中基於got表起始地址的偏移中的地址值確定動態鏈接庫中的函數實際地址,日後再詳細調研學習這塊.

2.4 鏈接類型比較:

在這裏插入圖片描述
靜態鏈接如果program A和 program B都使用到c.o,需要各自鏈接c.o至各自的可執行文件中,
缺點:比較浪費空間,另外更新困難.
優點: 編譯時鏈接,啓動性能相對較好.
動態鏈接中不需要重複裝載已裝載的共享庫,運行時將共享庫的映射到進程的虛擬地址空間中即可
優點: 節省空間,更新方便
缺點: 運行時準確來說是裝載時鏈接,影響啓動性能

據估算,動態鏈接與靜態鏈接相比,性能損失大約在5%以下,這點性能損失用來換取程序在空間上的節省和程序構建和升級時的靈活性是相當值得的.

三.裝載

3.1 裝載過程:

在這裏插入圖片描述
1.裝載過程即可執行文件加載到內存中開始執行的過程,系統會將可執行文件中對應的section依據上面提到的執行視圖映射到虛擬內存中,
2.若執行到這一段虛擬內存時發現該虛擬內存對應的物理內存是空的則會發生缺頁中斷,下一步即會將可執行文件的該部分裝載到物理內存中,
3.然後執行.

3.2 native程序裝載執行過程:

在這裏插入圖片描述
1.裝載的過程即exec執行過程,exec執行發現虛擬地址指向的物理地址沒有代碼或數據MMU便會產生缺頁錯誤,去加載該段內容到物理內存中執行.
2.大部分程序都採用動態鏈接,當程序從內核轉到用戶太時第一次執行的並非程序的入口地址,而是linker動態連接器的入口.
3.動態連接器自舉之後會去鏈接裝載程序需要的動態庫,準備好了之後纔會去調用可執行程序文件的入口,繼而調用到程序的main方法.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章