一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

dlopen、dlsym和dlclose的使用和舉例

 jiffes 2017-02-08
2013-12-27 16:13 10413人閱讀 評(píng)論(2) 收藏 舉報(bào)
分類(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ù) 
  包含頭文件: 
  #include <dlfcn.h> 
  函數(shù)定義: 
  void * dlopen( const char * pathname, int mode ); 
  函數(shù)描述: 
  在dlopen的()函數(shù)以指定模式打開(kāi)指定的動(dòng)態(tài)連接庫(kù)文件,并返回一個(gè)句柄給調(diào)用進(jìn)程。使用dlclose()來(lái)卸載打開(kāi)的庫(kù)。 
  mode:分為這兩種 
  RTLD_LAZY 暫緩決定,等有需要時(shí)再解出符號(hào) 
  RTLD_NOW 立即決定,返回前解除所有未決定的符號(hào)。 
  RTLD_LOCAL 
  RTLD_GLOBAL 允許導(dǎo)出符號(hào) 
  RTLD_GROUP 
  RTLD_WORLD 


  返回值
  打開(kāi)錯(cuò)誤返回NULL 
  成功,返回庫(kù)引用 
  編譯時(shí)候要加入 -ldl (指定dl庫(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ù)地址,也可以獲取變量地址。
handle是由dlopen打開(kāi)動(dòng)態(tài)鏈接庫(kù)后返回的指針,symbol就是要求獲取的函數(shù)或全局變量的名稱(chēng)。

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>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

typedef struct {
 const char *module;
 int  (*GetValue)(char *pszVal);
 int   (*PrintfHello)();
} hello_ST_API;


int GetValue(char *pszVal)
{
 int retval = -1;
 
 if (pszVal)
  retval = sprintf(pszVal, "%s", "123456");
  printf("%s, %d, pszVer = %s\n", __FUNCTION__, __LINE__, pszVal);
 return retval;
}

int PrintfHello()
{
 int retval = -1;
 
 printf("%s, %d, hello everyone\n", __FUNCTION__, __LINE__);
 return 0;
}

const hello_ST_API  Hello = {
     .module = "hello",
   GetValue,
   PrintfHello,
};

 

編譯的時(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>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>

typedef struct {
 const char *module;
 int  (*GetValue)(char *pszVal);
 int   (*PrintfHello)();
} hello_ST_API;


int main(int argc, char **argv)
{
 hello_ST_API *hello;
 int i = 0;
 void *handle;
 char psValue[20] = {0};
 
 handle = dlopen(“庫(kù)存放的絕對(duì)路徑,你可以試試相對(duì)路徑是不行的", RTLD_LAZY);
 if (! handle) {
  printf("%s,%d, NULL == handle\n", __FUNCTION__, __LINE__);
  return -1;
 }
 dlerror();

 hello = dlsym(handle, "Hello");
 if (!hello) {
  printf("%s,%d, NULL == handle\n", __FUNCTION__, __LINE__);
  return -1;
 }

 if (hello && hello->PrintfHello)
  i = hello->PrintfHello();
  printf("%s, %d, i = %d\n", __FUNCTION__, __LINE__, i);
 if (hello && hello->GetValue)
  i = hello->GetValue(psValue);

 if (hello && hello->module)
  {
   printf("%s, %d, module = %s\n", __FUNCTION__, __LINE__, hello->module);
  }

    dlclose(handle);
    return 0;
}

 

編譯指令:gcc -o test hello_dlopen.c -ldl

 

運(yùn)行./test結(jié)果如下。

PrintfHello, 27, hello everyone
main, 36, i = 0
GetValue, 19, pszVer = 123456
main, 42, module = hello

可以看到結(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啊?

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多

    国产精品欧美在线观看| 久热青青草视频在线观看| 国产欧美日韩在线精品一二区| 高清免费在线不卡视频| 欧美激情一区二区亚洲专区| 日韩欧美中文字幕人妻| 日韩综合国产欧美一区| 久久大香蕉精品在线观看| 国产av一区二区三区久久不卡 | 亚洲国产精品国自产拍社区| 亚洲另类欧美综合日韩精品 | 国产一区欧美一区日韩一区| 精品国产亚洲一区二区三区| 蜜桃传媒视频麻豆第一区| 久久精品色妇熟妇丰满人妻91| 东京热电东京热一区二区三区| 能在线看的视频你懂的| 国产综合欧美日韩在线精品| 日本本亚洲三级在线播放| 国内精品美女福利av在线| 亚洲精品福利视频在线观看| 91免费精品国自产拍偷拍| 男女午夜福利院在线观看| 日本精品最新字幕视频播放| 日韩精品一区二区三区四区 | 欧美日韩精品一区二区三区不卡| 99亚洲综合精品成人网色播| 国产精品欧美一区二区三区不卡 | 国产女优视频一区二区| 国产麻豆一线二线三线| 亚洲天堂国产精品久久精品| 亚洲综合日韩精品欧美综合区| 狠狠亚洲丁香综合久久| 观看日韩精品在线视频| 国产内射一级一片内射高清| 日本高清加勒比免费在线| 日韩丝袜诱惑一区二区| 国产精品香蕉在线的人| 99在线视频精品免费播放| 日韩精品一级片免费看| 欧美日韩三区在线观看|