1. 程式人生 > >Linux共享庫的動態載入(附測試案例)

Linux共享庫的動態載入(附測試案例)

共享庫的動態載入是指可以在程式執行的過程中去載入所需的共享庫。常用於某些系統或者應用程式的自動升級。
在C語言的源程式動態載入共享庫,需要呼叫一組特殊的函式,它們被聲明於一個專門的標頭檔案dlfcn.h,並在一個獨立的庫中予以實現。使用這組函式需要包含此標頭檔案,並連結該庫。

使用共享庫的動態載入時需要用到的函式
1、dlopen函式:開啟一個動態連結庫,並返回動態連結庫的控制代碼
void *dlopen(const char *filename, int flag);
引數解析:
1)字串形式的檔名(路徑名),主要用於指定共享庫檔名
2)載入共享庫的方式,常用方式如下:
RTLD_LAZY - 延遲載入
RTLD_NOW - 立即載入
返回值:成功時返回所對應的控制代碼(地址)資訊,失敗返回NULL;
2、dlsym函式:根據動態連結庫操作控制代碼與符號,返回符號對應的地址
void *dlsym(void *handle, const char *symbol);
引數解析:
1)表示具體的控制代碼資訊,也就是dlopen函式的返回值;
2)字串形式的符號/識別符號,通常指“函式名”;
返回值:成功返回函式對應的地址資訊,失敗返回NULL;
3、dlclose函式:用於關閉指定控制代碼的動態連結庫,只有當此動態連結庫的使用計數為0時,才會真正被系統解除安裝。
int dlclose(void *handle);
引數解析:
具體的控制代碼資訊,也就是dlopen函式的返回值。
4、dlerror函式:
可以返回出錯資訊,返回值為NULL時表示操作函式執行成功。
char *dlerror(void);
引數解析:
具體的控制代碼資訊,也就是dlopen函式的返回值。
該函式主要用於獲取dlopen()/dlsym()/dlclose()函式呼叫期間產生的錯誤資訊,如果沒有產生錯誤,則返回NULL;

2、測試程式碼
這裡寫圖片描述
3、呼叫方式及結果如下:
這裡寫圖片描述
這裡使用-ldl選項指明生成的物件模組需要使用共享庫。

以下是我的個人公眾號,主要作為C/C++語言技術分享使用,該公眾號裡乾貨滿滿,如果您有對此博文的疑問或者java方面的問題也可以新增公眾號交流討論。最後,再次希望您能新增關注,互相交流互相學習共同進步:
這裡寫圖片描述