ilocker:關注 Android 安全(新入行,0基礎) QQ: 2597294287程序員
一、浪費內存和磁盤空間安全
假設模塊 A 和 B 都依賴於 C,採用靜態連接的方式,C 庫被連接到 A 和 B,這樣不管是存儲在磁盤仍是在內存運行時,模塊 C 都有2個副本。性能
二、程序維護麻煩學習
假設程序依賴不少庫,其中任意一個修改了 bug 或進行了更新,都須要從新連接,從新發布。spa
把連接過程推遲到運行時再進行。版本控制
假設模塊 A 和 B 都依賴於 C,採用動態連接的方式,在運行時,模塊 C 在內存中只有一份,由 A 和 B 共享,在磁盤中也只有一份獨立的 C 共享庫便可。遞歸
採用動態連接,解決了上面提到的靜態連接的兩個缺點。接口
動態連接的過程大體是先遞歸的將依賴庫加載到內存,而後進行符號解析和地址重定位,最後執行入口點程序。內存
一、共享庫的版本控制問題學習資料
動態連接的基本思想是將程序拆分爲各個相對獨立的模塊。一個常見的問題是,當程序所依賴的某個模塊更新後,因爲新舊模塊的接口不兼容,致使原有的一些程序沒法運行。
二、性能損耗
採用動態連接,程序每次運行時都要從新進行連接,這樣會致使一些性能損耗。使用延遲綁定 (Lazy Binding) 能夠儘可能減少這種性能損耗。
最快的學習方式是看代碼,好比通讀 Android 系統的 Linker 代碼。整個 Linker 的代碼量不是很大,但前提要對 ELF 格式有必定的理解。
學習資料: 《程序員的自我修養——連接、裝載和庫》