日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】采用dlopen、dlsym、dlclose加载动态链接库

發布時間:2025/3/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】采用dlopen、dlsym、dlclose加载动态链接库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

1、前言

  為了使程序方便擴展,具備通用性,可以采用插件形式。采用異步事件驅動模型,保證主控制邏輯不變,將各個業務以動態鏈接庫的形式加載進來,這就是所謂的插件。linux提供了加載和處理動態鏈接庫的系統調用,非常方便。本文先從使用上進行總結,涉及到基本的操作方法,關于動態鏈接庫的本質及如何加載進來,需要進一步學習,后續繼續補充。如何將程序設計為插件形式,挖掘出主題和業務之間的關系,需要進一步去學習。

2、生產動態鏈接庫

編譯參數 gcc -fPIC -shared

例如我將如下程序編譯為動態鏈接庫libcaculate.so,程序如下:

caculate.c

int add(int a,int b) {return (a + b); }int sub(int a, int b) {return (a - b); }int mul(int a, int b) {return (a * b); }int div(int a, int b) {return (a / b); }

編譯如下:gcc -fPIC -shared caculate.c -o libcaculate.so

3、dlopen、dlsym函數介紹

  在linux上man dlopen可以看到使用說明,函數聲明如下:

#include <dlfcn.h>void *dlopen(const char *filename, int flag);char *dlerror(void);void *dlsym(void *handle, const char *symbol);int dlclose(void *handle);

  dlopen以制定模式打開指定的動態鏈接庫文件,并返回一個句柄給調用進程,dlerror返回出現的錯誤,dlsym通過句柄和連接符號名稱獲取函數名或者變量名,dlclose來卸載打開的庫。dlopen打開模式如下:

  RTLD_LAZY 暫緩決定,等有需要時再解出符號

  RTLD_NOW 立即決定,返回前解除所有未決定的符號

  采用上面生成的libcaculate.so,寫個測試程序如下:

main.c

#include <stdio.h> #include <stdlib.h> #include <dlfcn.h>//動態鏈接庫路徑 #define LIB_CACULATE_PATH "./libcaculate.so"//函數指針 typedef int (*CAC_FUNC)(int, int);int main() {void *handle;char *error;CAC_FUNC cac_func = NULL;//打開動態鏈接庫handle = dlopen(LIB_CACULATE_PATH, RTLD_LAZY);if (!handle) {fprintf(stderr, "%s\n", dlerror());exit(EXIT_FAILURE);}//清除之前存在的錯誤 dlerror();//獲取一個函數*(void **) (&cac_func) = dlsym(handle, "add");if ((error = dlerror()) != NULL) {fprintf(stderr, "%s\n", error);exit(EXIT_FAILURE);}printf("add: %d\n", (*cac_func)(2,7));cac_func = (CAC_FUNC)dlsym(handle, "sub");printf("sub: %d\n", cac_func(9,2));cac_func = (CAC_FUNC)dlsym(handle, "mul");printf("mul: %d\n", cac_func(3,2));cac_func = (CAC_FUNC)dlsym(handle, "div");printf("div: %d\n", cac_func(8,2));//關閉動態鏈接庫 dlclose(handle);exit(EXIT_SUCCESS); }

使用如下指令編譯程序:

gcc -rdynamic -o main main.c -ldl

注:在動態庫的使用程序里面根據動態庫提供的函數接口聲明調用動態庫里面的函數,在編譯時,需要加入選項

-rdynamic-ldl。

選項 -rdynamic 用來通知鏈接器將所有符號添加到動態符號表中,目的是能夠通過使用dlopen來實現向后跟蹤。

選項 -ldl 表示生成的對象模塊需要使用共享庫,這個庫里面包含了dlopen、dlsym等等的函數,也就是說,是支持“在運行時,顯示加載使用動態連接庫”的函數庫。相關的頭文件是dlfcn.h

測試結果如下所示:

?

轉自:http://www.cnblogs.com/Anker/p/3746802.html

轉載于:https://www.cnblogs.com/codingmengmeng/p/7463036.html

總結

以上是生活随笔為你收集整理的【转】采用dlopen、dlsym、dlclose加载动态链接库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。