Linux 動態庫的顯示呼叫

2021-06-26 17:32:45 字數 2215 閱讀 8722

分類: 動態庫與靜態庫

2012-03-17 23:56

1710人閱讀收藏

舉報 linux

null

library

測試web服務

apache

10.動態庫的顯式呼叫

庫函式dlopen()將開啟乙個新庫,並把它裝入記憶體。該函式主要用來載入庫中的符號,這些符號在編譯的時候是不知道的。比如apache web伺服器利用這個函式在執行過程中載入模組,這為它提供了額外的能力。乙個配置檔案控制了載入模組的過程。這種機制使得在系統中新增或者刪除乙個模組時,都不需要重新編譯了。

dlopen()在dlfcn.h中定義,並在dl庫中實現。它需要兩個引數:乙個檔名和乙個標誌。檔名可以是我們學習過的庫名字。標誌指明是否立刻計算庫的依賴性。如果設定為rtld_now的話,則立刻計算;如果設定的是rtld_lazy,則在需要的時候才計算。另外,可以指定rtld_global,它使得那些在以後才載入的庫可以獲得其中的符號。

當庫被裝入後,可以把 dlopen()返回的控制代碼作為給 dlsym()的第乙個引數,以獲得符號在庫中的位址。使用這個位址,就可以獲得庫中特定函式的指標,並且呼叫裝載庫中的相應函式。

下面詳細說明一下這些函式。

原型為:const char *dlerror(void);

當動態鏈結庫操作函式執行失敗時,dlerror可以返回出錯資訊,返回值為null時表示操作函式執行成功。

原型為:void *dlopen (const char *filename, int flag);

dlopen用於開啟指定名字(filename)的動態鏈結庫,並返回操作控制代碼。

filename:如果名字不以/開頭,則非絕對路徑名,將按下列先後順序查詢該檔案。

(1)使用者環境變數中的ld_library值;

(2)動態鏈結緩衝檔案/etc/ld.so.cache

(3)目錄/lib,/usr/lib

flag表示在什麼時候解決未定義的符號(呼叫)。取值有兩個:

1)rtld_lazy :表明在動態鏈結庫的函式**執行時解決。

2)rtld_now :表明在dlopen返回前就解決所有未定義的符號,一旦未解決,dlopen將返回錯誤。

dlopen呼叫失敗時,將返回null值,否則返回的是操作控制代碼。

取函式執行位址

原型為:void *dlsym(void *handle, char *symbol);

dlsym根據動態鏈結庫操作控制代碼(handle)與符號(symbol),返回符號對應的函式的執行**位址。由此位址,可以帶引數執行相應的函式。

如程式**:void (*add)(int x,int y); /*說明一下要呼叫的動態函式add*/

add=dlsym("***.so","add");/*開啟***.so共享庫,取add函式位址*/

add(89,369);/*帶兩個引數89和369呼叫add函式*/

原型為:int dlclose (void *handle);

dlclose用於關閉指定控制代碼的動態鏈結庫,只有當此動態鏈結庫的使用計數為0時,才會真正被系統解除安裝。

編寫測試檔案

[html]view plain

copy

#include<

stdio.h

>

#include<

dlfcn.h

> //用於動態庫管理的系統標頭檔案  

#include"test.h" //要把函式的標頭檔案包含進來,否則編譯時會報錯  

intmain(int argc,char* argv)  

char*pszerr = dlerror();  

if(pszerr!= null)  

//獲取函式的位址  

ptest= dlsym(pdlhandle, "test");  

pszerr= dlerror();  

if(pszerr!= null)  

//實現函式呼叫  

(*ptest)();  

//程式結束時關閉動態庫  

dlclose(pdlhandle);  

return0;  

}   

2、編譯測試檔案使用-ldl選項指明生成的物件模組需要使用共享庫

gcc -omain -ldl main.c

執行完後就生成了乙個main檔案

3、執行測試程式

執行 ./main

靜態庫與動態庫使用 顯示呼叫動態鏈結

1 案例 如何顯示的呼叫動態鏈結庫 1 建立專案test100 2 寫標頭檔案source.h 和原始檔 source.cpp source.h pragma once ifdef test exports define mipetaialgorithm api declspec dllexport...

除錯linux的動態庫(動態庫的建立 呼叫 除錯)

add是庫lib.c中的函式,生成liblib.so gcc lib.c shared g debug o liblib.so 編譯呼叫庫的程式,指定庫檔案使用當前路徑 給動態庫函式add設定斷點 gdb b add 在下面提示中輸入 y function add not defined.make ...

Linux環境下動態庫的呼叫

1 開啟動態鏈結庫 dlopen,函式原型為 void dlopen const char filename,int flag dlopen用於開啟指定名字 filename 的動態鏈結庫,並返回操作控制代碼。dlclose用於關閉指定控制代碼的動態鏈結庫,只有當此動態鏈結庫的使用計數為0時,才會真...