程序員的自我修養第七章讀書筆記-動態鏈接2

顯式運行時鏈接

支持動態鏈接的系統都支持一種更加靈活的模塊加載方式,叫做顯示運行時鏈接(Explicit Run-time Linking),有時也叫運行時加載。也就是讓程序自己在運行時控制加載指定的模塊,並且可以在不需要該模塊時將其卸載。一般的共享對象不需要進行任何修改就可以進行運行時裝載,這種共享對象往往被叫做動態裝載庫(Dynamic Loading Library),其實本質上它跟一般的共享對象沒什麼區別,只是程序開發者使用它的角度不同。

在Linux 中,從文件本身的格式上來看,動態庫實際上跟一般的共享對象沒有區別。主要的區別是共享對象是由動態鏈接器在程序啓動之前負責裝載和鏈接的,這一系列步驟都由動態鏈接器在程序啓動之前負責裝載和鏈接的,這一系列步驟都由動態鏈接器自動完成,對於程序本身是透明的;而動態庫的裝載是通過一系列由動態鏈接庫提供的API,具體的講有4個函數:打開動態庫(dlopen)、查找符號(dlsym)、錯誤處理(dlerror)以及關閉動態庫(dlclose),程序可以通過這幾個API對動態庫進行操作。這幾個API的實現是在/lib/libdl.so.2裏面,他們的聲明和相關常量被定義在系統標準庫文件

1.dlopen()

打開一個動態庫,並將其加載到進程的地址空間,以完成初始化過程。

2.dlsym()

dlsym函數基本上是運行時裝載的核心部分,我們可以通過這個函數找到所需要的符號。

3.dlerror()

每次我們調用dlopen()、dlsym()或者dlclose()以後,我們都可以通過dlerror()函數來判斷上一次調用是否成功。dlerror()的返回值類型是char *,如果返回NULL,則表示上一次調用成功;如果不是,則返回相應的錯誤消息。

4.dlclose()

dlclose()的作用跟dlopen()剛好相反,它的作用的是將一個已經加載的模塊卸載。

第七章小結

裝載時重定位和地址無關代碼是解決絕對地址引用問題的兩個方法,裝載時重定位的缺點是無法共享代碼,但是他的運行速度較快;而地址無關代碼的缺點是運行速度較慢,但它可以實現代碼段在各個進程之間的共享。

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