分類(lèi):
dlopen、dlsym和dlclose的使用和舉例之前用過(guò)這三個(gè)函數(shù)一直沒(méi)時(shí)間整理一下。今天抽時(shí)間整理一下。 1、函數(shù)簡(jiǎn)介 dlopen 基本定義 功能:打開(kāi)一個(gè)動(dòng)態(tài)鏈接庫(kù)
dlsym() 根據(jù)動(dòng)態(tài)鏈接庫(kù)操作句柄與符號(hào),返回符號(hào)對(duì)應(yīng)的地址。
包含頭文件:
#include <dlfcn.h>
函數(shù)定義:
void*dlsym(void* handle,const char* symbol)
函數(shù)描述:
dlsym根據(jù)動(dòng)態(tài)鏈接庫(kù)操作句柄(handle)與符號(hào)(symbol),返回符號(hào)對(duì)應(yīng)的地址。使用這個(gè)函數(shù)不但可以獲取函數(shù)地址,也可以獲取變量地址。
dlclose()
dlclose用于關(guān)閉指定句柄的動(dòng)態(tài)鏈接庫(kù),只有當(dāng)此動(dòng)態(tài)鏈接庫(kù)的使用計(jì)數(shù)為0時(shí),才會(huì)真正被系統(tǒng)卸載。
上述都是摘抄,總結(jié)為鏈接的時(shí)候需要用到dl庫(kù),編譯的時(shí)候需要加上dlfcn.h頭文件。才能保證編譯不會(huì)報(bào)錯(cuò)。
2、生成動(dòng)態(tài)庫(kù)
hello.c函數(shù)原型:
#include <sys/types.h> typedef struct {
int PrintfHello() const hello_ST_API Hello = {
編譯的時(shí)候用指令: gcc -shared -o hello.so hello.c
上面的函數(shù)是用一個(gè)全局結(jié)構(gòu)體hello來(lái)指向。在dlsym定義中說(shuō)不僅可以獲取函數(shù)的地址,還可以獲取全局變量的地址。所以此處是想通過(guò)dlsym來(lái)獲取全局變量的地址。好處自己慢慢體會(huì)。 3、dlopen代碼 #include <sys/types.h> typedef struct {
hello = dlsym(handle, "Hello"); if (hello && hello->PrintfHello) if (hello && hello->module) dlclose(handle);
編譯指令:gcc -o test hello_dlopen.c -ldl
運(yùn)行./test結(jié)果如下。 PrintfHello, 27, hello everyone 可以看到結(jié)果正常出來(lái)了。
看到?jīng)]用?dlsym找到全局結(jié)構(gòu)體hello后,可以直接用這個(gè)全局結(jié)構(gòu)體指針來(lái)使用庫(kù)里面的函數(shù)了,因?yàn)槲覀冇袝r(shí)候提供的庫(kù)不僅僅是一個(gè)兩個(gè)函數(shù)的,一般的一個(gè)庫(kù)都會(huì)存在多個(gè)函數(shù),用這種方式就可以直接使用了。不然找函數(shù)名稱(chēng)的話要寫(xiě)多少個(gè)dlsym啊? |
|