dlopen()
功能:開啟一個動態連結程式庫
包含標頭檔:
#include <dlfcn.h>
函數定義:
void * dlopen( const char * pathname, int mode );
函數描述:
在dlopen的()函數以指定模式開啟指定的動態串連庫檔案,並返回一個控制代碼給調用進程。使用dlclose()來卸載開啟的庫。
mode是開啟檔案,其值有多個,不同作業系統上實現的功能有所不同,在linux下,按功能可分為三類:
1、解析方式
RTLD_LAZY:在dlopen返回前,對於動態庫中的未定義的符號不執行解析(只對函數引用有效,對於變數引用總是立即解析)。
RTLD_NOW: 需要在dlopen返回前,解析出所有未定義符號,如果解析不出來,在dlopen會返回NULL,錯誤為:: undefined symbol: xxxx.......
2、作用範圍,可與解析方式通過“|”組合使用。
RTLD_GLOBAL:動態庫中定義的符號可被其後開啟的其它庫重定位。
RTLD_LOCAL: 與RTLD_GLOBAL作用相反,動態庫中定義的符號不能被其後開啟的其它庫重定位。如果沒有指明是RTLD_GLOBAL還是RTLD_LOCAL,則預設為RTLD_LOCAL。
3、作用方式
RTLD_NODELETE: 在dlclose()期間不卸載庫,並且在以後使用dlopen()重新載入庫時不初始化庫中的靜態變數。這個flag不是POSIX-2001標準。
RTLD_NOLOAD: 不載入庫。可用於測試庫是否已載入(dlopen()返回NULL說明未載入,否則說明已載入),也可用於改變已載入庫的flag,如:先前載入庫的flag為RTLD_LOCAL,用dlopen(RTLD_NOLOAD|RTLD_GLOBAL)後flag將變成RTLD_GLOBAL。這個flag不是POSIX-2001標準。
RTLD_DEEPBIND:在搜尋全域符號前先搜尋庫內的符號,避免同名符號的衝突。這個flag不是POSIX-2001標準。
傳回值:
開啟錯誤返回NULL
成功,返回庫引用
編譯時間候要加入 -ldl (指定dl庫)
例如
gcc test.c -o test -ldl