Linux 动态库的显示调用
Linux 動態(tài)庫的顯示調(diào)用
分類: 動態(tài)庫與靜態(tài)庫 2012-03-17 23:56 1710人閱讀 評論(0) 收藏 舉報 linuxnulllibrary測試web服務(wù)apache10.動態(tài)庫的顯式調(diào)用
庫函數(shù)dlopen()將打開一個新庫,并把它裝入內(nèi)存。該函數(shù)主要用來加載庫中的符號,這些符號在編譯的時候是不知道的。比如Apache Web服務(wù)器利用這個函數(shù)在運行過程中加載模塊,這為它提供了額外的能力。一個配置文件控制了加載模塊的過程。這種機(jī)制使得在系統(tǒng)中添加或者刪除一個模塊時,都不需要重新編譯了。
dlopen()在dlfcn.h中定義,并在dl庫中實現(xiàn)。它需要兩個參數(shù):一個文件名和一個標(biāo)志。文件名可以是我們學(xué)習(xí)過的庫名字。標(biāo)志指明是否立刻計算庫的依賴性。如果設(shè)置為RTLD_NOW的話,則立刻計算;如果設(shè)置的是RTLD_LAZY,則在需要的時候才計算。另外,可以指定RTLD_GLOBAL,它使得那些在以后才加載的庫可以獲得其中的符號。
當(dāng)庫被裝入后,可以把 dlopen()返回的句柄作為給 dlsym()的第一個參數(shù),以獲得符號在庫中的地址。使用這個地址,就可以獲得庫中特定函數(shù)的指針,并且調(diào)用裝載庫中的相應(yīng)函數(shù)。
下面詳細(xì)說明一下這些函數(shù)。
-
dlerror
原型為:const char *dlerror(void);
當(dāng)動態(tài)鏈接庫操作函數(shù)執(zhí)行失敗時,dlerror可以返回出錯信息,返回值為NULL時表示操作函數(shù)執(zhí)行成功。
-
dlopen
原型為:void *dlopen (const char *filename, int flag);
dlopen用于打開指定名字(filename)的動態(tài)鏈接庫,并返回操作句柄。
filename:如果名字不以/開頭,則非絕對路徑名,將按下列先后順序查找該文件。
(1)用戶環(huán)境變量中的LD_LIBRARY值;
(2)動態(tài)鏈接緩沖文件/etc/ld.so.cache
(3)目錄/lib,/usr/lib
flag表示在什么時候解決未定義的符號(調(diào)用)。取值有兩個:
1)RTLD_LAZY :表明在動態(tài)鏈接庫的函數(shù)代碼執(zhí)行時解決。
2)RTLD_NOW :表明在dlopen返回前就解決所有未定義的符號,一旦未解決,dlopen將返回錯誤。
dlopen調(diào)用失敗時,將返回NULL值,否則返回的是操作句柄。
-
dlsym
取函數(shù)執(zhí)行地址
原型為:void *dlsym(void *handle, char *symbol);
dlsym根據(jù)動態(tài)鏈接庫操作句柄(handle)與符號(symbol),返回符號對應(yīng)的函數(shù)的執(zhí)行代碼地址。由此地址,可以帶參數(shù)執(zhí)行相應(yīng)的函數(shù)。
如程序代碼:void (*add)(int x,int y); /*說明一下要調(diào)用的動態(tài)函數(shù)add*/
add=dlsym("xxx.so","add");/*打開xxx.so共享庫,取add函數(shù)地址*/
add(89,369);/*帶兩個參數(shù)89和369調(diào)用add函數(shù)*/
-
dlclose:關(guān)閉動態(tài)鏈接庫
原型為:int dlclose (void *handle);
dlclose用于關(guān)閉指定句柄的動態(tài)鏈接庫,只有當(dāng)此動態(tài)鏈接庫的使用計數(shù)為0時,才會真正被系統(tǒng)卸載。
編寫測試文件
[html] view plaincopy2、編譯測試文件使用-ldl選項指明生成的對象模塊需要使用共享庫
gcc -omain -ldl main.c
執(zhí)行完后就生成了一個main文件
3、執(zhí)行測試程序
執(zhí)行 ./main
總結(jié)
以上是生活随笔為你收集整理的Linux 动态库的显示调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Adobe illustrator 删除
- 下一篇: 阐述Linux动态库的显式调用