動態鏈結相關

2021-09-27 11:47:04 字數 1007 閱讀 9761

對於需要進行動態鏈結的共享物件,共享物件中的絕對位址在鏈結的時候不進行重定位,而是在裝載執行的時候進行重定位。

由於需要動態鏈結的共享物件被裝載對映至虛擬空間之後,指令部分是在多個程序之間共享的,由於裝載時重定位的方法需要修改指令,所以沒有辦法做到同乙份指令被多個程序共享,因為指令在被重定位之後對於每個程序來說是不同的。

上述裝載時重定位的缺點是:指令部分無法在多個程序之間共享,這樣就失去了動態鏈結節省記憶體的優勢。為了解決這個問題,其實我們的目的很簡單,希望共享物件中共享的指令部分在裝載時不需要因為裝載位址的改變而改變,所以實現的基本想法就是:把那些需要被修改的部分分離出來,跟資料部分放在一起,這樣指令部分就可以保持不變,而資料部分在每個程序中都有乙個副本,這種方法就叫做位址無關**技術。

對於乙個共享物件中的資料和函式,可以分成四類:

①模組內部的函式呼叫

②模組外部的函式呼叫

③模組內部的資料訪問

④模組外部的資料訪問

對於模組內部資料或者函式******

對於模組外部資料或者函式的訪問或呼叫,基本的思想就是將跟位址相關的部分放到資料段裡面,這些其他模組中的函式或資料的位址跟模組的裝載位址相關,elf在資料段裡面建立了乙個指向這些變數的指標陣列,這個指標陣列就叫做got,如果想引用其他模組的函式或者資料,就通過got中相對應的項進行間接引用。

got是如何做到位址無關的呢?

動態鏈結相比於靜態鏈結的優點和缺點:

優點:缺點:

動態鏈結效能要比靜態鏈結差一些,主要原因是以下兩點:

①動態鏈結下對於其他模組的資料和函式的引用都要先進行got定位,然後再進行間接跳轉。

②用以實現延遲繫結的方法就是plt。按照got的原理,當我們呼叫某個模組外部的函式或者資料時,我們通過got中相應的項進行間接的跳轉,plt為了實現延遲繫結,在這個過程中間又加了一層間接性。當我們呼叫某個模組外部的函式或者資料時,並不是直接通過got表進行跳轉,而是通過乙個叫做plt項的結構進行跳轉,每乙個外部函式在plt中都有乙個項,例如我們在main函式中呼叫puts函式,puts函式在plt

Linux動態鏈結之三 動態鏈結相關結構

無論是靜態鏈結還是動態鏈結,初始都是作業系統讀取可執行檔案的file header,以檢查檔案格式 操作許可權等屬性,然後根據段表獲取各個 segment 的vma虛擬裝載位置 檔案位址和操作屬性rwxp等,再根據相似屬性原則相連原則完成裝載,而後將控制權交給檔案頭結構中e entry入口位址 el...

動態鏈結 靜態鏈結

在linux系統中,ld鏈結器將彙編器編譯出來的目標檔案和靜態庫里的.a檔案鏈結生成可執行檔案。靜態庫中的.a檔案的 會在靜態鏈結過程中新增到可執行檔案中,可執行檔案會變得很大。與靜態鏈結不同,linux系統的ld鏈結器會將動態庫.so檔案進行符號重定位生成可執行檔案,動態庫.so檔案並不新增到可執...

靜態鏈結 動態鏈結

如果函式庫的乙份拷貝是可執行檔案的物理組成部分,那麼我們稱之為靜態鏈結。如果可執行檔案只是包含了檔名,讓載入器在執行時能夠尋找程式所需的函式庫,那麼稱為動態鏈結。即根據函式庫是不是可執行檔案的組成部分區分靜態鏈結和動態鏈結。1 可執行檔案的體積小。2 雖然執行速度稍慢,但是能更加有效的利用磁碟空間,...