dlopen dlsym dlclose加载动态链接库
生活随笔
收集整理的這篇文章主要介紹了
dlopen dlsym dlclose加载动态链接库
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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庫) 例如 gcc test.c -o test -ldl 使用 dlopen
dlopen()是一個強大的庫函數。該函數將打開一個新庫,并把它裝入內存。該函數主要用來加載庫中的符號,這些符號在編譯的時候是不知道的。比如 Apache Web 服務器利用這個函數在運行過程中加載模塊,這為它提供了額外的能力。一個配置文件控制了加載模塊的過程。這種機制使得在系統中添加或者刪除一個模塊時,都不需要重新編譯了。 可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定義,并在 dl 庫中實現。它需要兩個參數:一個文件名和一個標志。文件名可以是我們學習過的庫中的 soname。標志指明是否立刻計算庫的依賴性。如果設置為 RTLD_NOW 的話,則立刻計算;如果設置的是 RTLD_LAZY,則在需要的時候才計算。另外,可以指定 RTLD_GLOBAL,它使得那些在以后才加載的庫可以獲得其中的符號。 當庫被裝入后,可以把 dlopen() 返回的句柄作為給?dlsym() 的第一個參數,以獲得符號在庫中的地址。使用這個地址,就可以獲得庫中特定函數的指針,并且調用裝載庫中的相應函數。 dlsym
功能:
根據動態鏈接庫操作句柄與符號,返回符號對應的地址。包含頭文件:
| 1 | #include<dlfcn.h> |
函數定義:
| 1 | void*dlsym(void*handle,constchar*symbol) |
函數描述:
dlsym(dynamic library symbol) 根據 動態鏈接庫 操作句柄(handle)與符號(symbol),返回符號對應的地址。使用這個函數不但可以獲取函數地址,也可以獲取變量地址。 handle:由dlopen打開動態鏈接庫后返回的指針; symbol:要求獲取的函數或全局變量的名稱。返回值:
void* 指向函數的地址,供調用使用。dlclose() 包含頭文件: #include <dlfcn.h> 函數原型為: int dlclose (void *handle); 函數描述: dlclose用于關閉指定句柄的動態鏈接庫,只有當此動態鏈接庫的使用計數為0時,才會真正被系統卸載。 dlerror
包含頭文件: #include <dlfcn.h> 函數原型: char *dlerror(void); 函數描述: 當動態鏈接庫操作函數執行失敗時,dlerror可以返回出錯信息,返回值為NULL時表示操作函數執行成功。
總結
以上是生活随笔為你收集整理的dlopen dlsym dlclose加载动态链接库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 时间接口
- 下一篇: c++中使用 hiredis/hir