如果你的程序中使用dlopen、dlsym、dlclose、dlerror 顯示加載動態庫,需要設置鏈接選項 -ldl
加載動態鏈接庫,首先為共享庫分配物理內存,然后在進程對應的頁表項中建立虛擬頁和物理頁面之間的映射。
你可以認為系統中存在一種引用計數機制, 每當一個進程加載了共享庫(在該進程的頁表中進行一次映射),引用計數加一;
一個進程顯式卸載(通過dlclose等)共享庫或進程退出時,引用計數減 一,
當減少到0時,系統卸載共享庫。
(1)打開動態鏈接庫:dlopen,函數原型void *dlopen (const char *filename, int flag); dlopen用於打開指定名字(filename)的動態鏈接庫,並返回操作句柄。
(2)取函數執行地址:dlsym,函數原型為: void *dlsym(void *handle, char *symbol); dlsym根據動態鏈接庫操作句柄(handle)與符號(symbol),返回符號對應的函數的執行代碼地址。
(3)關閉動態鏈接庫:dlclose,函數原型為: int dlclose (void *handle); dlclose用於關閉指定句柄的動態鏈接庫,只有當此動態鏈接庫的使用計數為0時,才會真正被系統卸載。
(4)動態庫錯誤函數:dlerror,函數原型為: const char *dlerror(void); 當動態鏈接庫操作函數執行失敗時,dlerror可以返回出錯信息,返回值為NULL時表示操作函數執行成功。