C語言 unix c 動態載入

2021-08-07 02:12:56 字數 1709 閱讀 7952

動態載入:

在程式中根據程式的需要,動態載入某個庫函式,這種行為稱為動態載入,系統為實現動態載入提供了一下函式:

man 3 dlopen顯示幫助:

標頭檔案:#include

void

*dlopen(const char *filename, int flag);

引數:filename:制定了動態庫的檔案名字

flag:

rtld_lazy:懶載入

rtld_now:立即載入

返回值:失敗的時候返回null,成功的時候返回乙個指標

char *dlerror(void);

功能:獲取dlopen,dlclose,slsym函式產生的錯誤

引數:無

返回值:返回乙個字串,這個字串描述了錯誤的原因

void

*dlsym(void

*handle, const char *symbol);

引數:handle:dlopen(3)的返回值,制定了要操作的庫函式

symbol:制定了要著的符號

int dlclose(void

*handle);

功能:將與handle相關的動態庫檔案的引用計數減1,庫檔案的引用計數減到0的時候,動態庫從記憶體中移除

引數:handle:制定了要關閉的動態庫,是dkopen(3)的返回值

返回值:非0代表錯誤,0代表成功

注意:link

with

-ldl

.//在gcc後面加上 -ldl

舉例說明:將libpmath.so動態庫載入到記憶體,並使用函式庫中的函式(dynamic.c)

#include

#include

typedef int (*func_t) (int,int);

int main(void)

printf("dlopen success...\n");

//在記憶體中查詢函式的入口位址

void

*f = dlsym(handle, "t_add");

if(f ==

null)

func_t p = (func_t)f; //func_t p = (int (*) (int,int))f 也可以

printf("3+2=%d\n", p(3,2));

//關閉動態庫

dlclose(handle);

return

0; }

測試dlopen,dlclose函式:

tarena@ubuntu:~/day/day25$ gcc dynamic.c -ldl

tarena@ubuntu:~/day/day25$ a.out

dlopen success...

測試dlerror函式:

tarena@ubuntu:~/day/day25$ a.out

libpath.so: cannot open shared object file: no such file or directory

測試dlsym函式:

tarena@ubuntu:~/day/day25$ gcc dynamic.c -ldl

tarena@ubuntu:~/day/day25$ a.out

dlopen success...3+

2=5

C語言 unix c 載入新的映像

使用新的映象替換舊的映象 載入新的影響使用execve 2 家族的函式 execve 2 include int execve const char filename,char const argv,char const envp 功能 執行程式 引數 filename 指定了要執行的程式 二進位制...

C語言 unix c 找到載入器的方法

找到載入器的方法 1 使用環境變數告訴載入器動態庫的搜尋路徑 export ld library path ld library path tmath 取出該變數的值,然後加上tmath後再賦值給變數 把動態庫檔案複製過去 舉例 tarena ubuntu day day24 tmath sudo ...

C語言 unix c 訊號基礎

二 訊號的基礎 1 什麼是訊號 訊號就是 軟中斷 軟中斷就是軟體模擬的中斷機制。2 中斷是什麼 正常的執行流程,訊號處理程式是兩條執行路線,但是屬於同乙個程序 3 系統為我們提供了哪些訊號?kill l 察看系統的中斷 64個訊號,32,33沒有 tarena ubuntu kill l 1 sig...