動態鏈結其實就是把鏈結的過程推遲到了執行時再進行。特點
重定位位址無關**
-fpic與-fpie
模組內部的函式呼叫、跳轉等【這種不需要重定位】
模組內部的資料訪問,比如模組中定義的全域性變數、靜態變數【相對定址】
模組外部的函式呼叫、跳轉等【got,但是儲存的是目標函式的位址】
模組外部的資料訪問,比如其他模組中定義的全域性變數【全域性偏移表(global offset table,got)–elf在資料段裡面建立了乙個指向和本模組裝載位址有關的其他模組的全域性變數的指標陣列】
共享模組的全域性變數問題
動態鏈結比靜態鏈結慢,原因?
動態鏈結下對於全域性和靜態的資料訪問都要進行複雜的got定位,然後間接定址;對於模組間的呼叫也要先定位got,然後進行間接跳轉
動態鏈結的鏈結工作在執行時完成
延遲繫結(plt)
基本思想:當函式第一次被用到的時候才進行繫結(符號查詢、重定位等)優點:加快程式的啟動速度【針對上面原因的第二點】
這種方法使用了一些很精妙的指令序列來完成。
1、 指令定址方式【彙編】
程式設計師的自我修養 動態鏈結(1)
7.1為什麼要動態鏈結 用動態鏈結的原因是因為靜態鏈結有這樣那樣的問題。對比二者我們可以總結出靜態鏈結的倆大缺點,和動態鏈結的兩大優點 1 靜態鏈結浪費記憶體和磁碟空間 靜態鏈結會把所有鏈結到的庫裝載入記憶體,而卻這些庫裝載入記憶體後只能給程序自己使用,不能共享給別的程式程序使用。用書中的例子說,1...
《程式設計師自我修養》閱讀筆記 動態鏈結
1 動態鏈結的含義。動態鏈結就是將鏈結時的重定位推遲到載入時。相比於靜態鏈結,動態鏈結的乙個優點是可以節省記憶體。因為共享檔案的 可以共享。使用動態鏈結的時候,可執行檔案和共享檔案都會載入到記憶體。但是,如果很多可執行檔案都使用了同乙個共享檔案的時候,共享檔案的 部分只需要裝載一次,這樣就達到了節省...
《程式設計師的自我修養》筆記 靜態鏈結
在通過編譯和彙編後,就生成了目標檔案,鏈結就是把這些目標檔案加工後合併成乙個輸出檔案的過程。鏈結過程可以分為兩步 第一步 空間與位址分配。掃瞄所有的輸入目標檔案,獲得它們每個各個段的長度 屬性和位置,並且將輸入目標檔案中的符號表中所有 的符號定義和符號引用收集起來,統一放到乙個全域性符號表。這一步中...