dlopen

dlopen

dlopen()是一個計算機函式,功能是以指定模式打開指定的動態程式庫檔案,並返回一個句柄給dlsym()的調用進程。使用dlclose()來卸載打開的庫。

基本信息

基本定義

功能:打開一個動態程式庫,並返回動態程式庫的句柄

包含頭檔案:

#include <dlfcn.h>

函式定義

void * dlopen( const char * pathname, int mode);

函式描述:

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庫) -rdynamic(通知連結器將所有符號添加到動態符號表中(目的是能夠通過使用 dlopen 來實現向後跟蹤)

例如

gcc test.c -o test -ldl-rdynamic

使用 dlopen

dlopen()是一個強大的庫函式。該函式將打開一個新庫,並把它裝入記憶體。該函式主要用來載入庫中的符號,這些符號在編譯的時候是不知道的。比如 Apache Web 伺服器利用這個函式在運行過程中載入模組,這為它提供了額外的能力。一個配置檔案控制了載入模組的過程。這種機制使得在系統中添加或者刪除一個模組時,都不需要重新編譯了。

可以在自己的程式中使用 dlopen()。dlopen() 在 dlfcn.h 中定義,並在 dl 庫中實現。它需要兩個參數:一個檔案名稱和一個標誌。檔案名稱可以是我們學習過的庫中的 soname。標誌指明是否立刻計算庫的依賴性。如果設定為 RTLD_NOW 的話,則立刻計算;如果設定的是 RTLD_LAZY,則在需要的時候才計算。另外,可以指定 RTLD_GLOBAL,它使得那些在以後才載入的庫可以獲得其中的符號。

當庫被裝入後,可以把 dlopen() 返回的句柄作為給 dlsym() 的第一個參數,以獲得符號在庫中的地址。使用這個地址,就可以獲得庫中特定函式的指針,並且調用裝載庫中的相應函式。

相關詞條

相關搜尋

熱門詞條

聯絡我們