學習記錄 dlopen和dlsym的使用

2021-07-22 12:43:18 字數 1433 閱讀 2963

c語言為了使程式方便擴充套件,具備通用性,可以採用外掛程式形式。採用非同步事件驅動模型,保證主程式邏輯不變,將各個業務已動態鏈結庫的形式載入進來,這就是所謂的外掛程式。linux提供了載入和處理動態鏈結庫的系統呼叫,非常方便。

dlopen函式以指定模式開啟指定的動態鏈結庫檔案,並返回乙個控制代碼給dlsym()的呼叫程序

dlclose 解除安裝開啟的庫

dlerror 返回出現的錯誤

dlsym dlsym通過控制代碼和連線符名稱獲取函式名或者變數名

int add(int a,int b)

intsub(int a, int b)

int mul(int a, int b)

int div(int a, int b)

編譯動態鏈結庫檔案

gcc -fpic -shared dl.c -o libdl.so

#include 

#include

#include

#define lib_caculate_path "./libdl.so"

typedef int (*cac_func)(int, int);

int main()

dlerror();

*(void **) (&cac_func) = dlsym(handle, "add");

if ((error = dlerror()) != null)

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 opendl opendl.c -ldl

[root@jaytang dlopen]# ls

dl.c libdl.so opendl opendl.c

執行./opendl

出現如下效果

[root@jaytang dlopen]# ./opendl

add:

9sub:

7mul:

6div:

4

原始碼見github

dlopen 和 dlsym 動態呼叫函式

dlopen 開啟乙個庫,獲取控制代碼。開啟so檔案獲取控制代碼 看作基位址 dlsym 在開啟的庫中查詢符號的值。so裡面查某個函式位址 dlclose 關閉控制代碼。dlerror 返回乙個描述最後一次呼叫dlopen dlsym,或 dlclose 的錯誤資訊的字串。import typede...

學習記錄 遞迴和堆疊

今天在學習遞迴和堆疊的知識 1 中,使用堆疊進行求和運算過程中遇到了 deque iterator not dereferencable 問題 include stdafx.h include include using namespace std 遞迴求和函式 int sum1 int value...

vi和vim學習記錄

學習的書為,鳥哥的linux私房菜第十章 裡面有張圖做出了很好的很直觀的解釋。開啟虛擬機器進行實際操作。首先看在一般模式下的主要常用操作。1 移動游標。a.可以使用反向鍵上下左右移動。c.數字0 或者 功能鍵 home 移動到這一行的最前面字元處 或者 end 移動到這一行的最後面的字元處。g移動到...