dlsym()
如果你加載了一個DL函數庫而不去使用當然是不可能的了
使用一個DL函數庫的最主要的一個函數就是dlsym()
這個函數在一個已經打開的函數庫裡面查找給定的符號
這個函數如下定義
void * dlsym(void *handle
char *symbol);
函數中的參數handle就是由dlopen打開後返回的句柄
symbol是一個以NIL結尾的字符串
如果dlsym()函數沒有找到需要查找的symbol
則返回NULL
如果你知道某個symbol的值不可能是NULL或者
那麼就很好
你就可以根據這個返回結果判斷查找的symbol是否存在了
不過
如果某個symbol的值就是NULL
那麼這個判斷就有問題了
標准的判斷方法是先調用dlerror()
清除以前可能存在的錯誤
然後調用dlsym()來訪問一個symbol
然後再調用dlerror()來判斷是否出現了錯誤
一個典型的過程如下
dlerror(); /* clear error code */
s = (actual_type) dlsym(handle
symbol_being_searched_for);
if ((err = dlerror()) != NULL)
{
/* handle error
the symbol wasn
t found */
}
else
{
/* symbol found
its value is in s */
}
dlclose()
dlopen()函數的反過程就是dlclose()函數
dlclose()函數用力關閉一個DL函數庫
Dl函數庫維持一個資源利用的計數器
當調用dlclose的時候
就把這個計數器的計數減一
如果計數器為
則真正的釋放掉
真正釋放的時候
如果函數庫裡面有_fini()這個函數
則自動調用_fini()這個函數
做一些必要的處理
Dlclose()返回
表示成功
其他非
值表示錯誤
DL Library Example
下面是一個例子
例子中調入math函數庫
然後打印
的余弦函數值
例子中每次都檢查是否出錯
應該是個不錯的范例
#include
#include
#include
int main(int argc
char **argv)
{
void *handle;
double (*cosine)(double);
char *error;
handle = dlopen (
/lib/libm
so
RTLD_LAZY);
if (!handle) {
fputs (dlerror()
stderr);
exit(
);
}
cosine = dlsym(handle
cos
);
if ((error = dlerror()) != NULL)
{
fputs(error
stderr);
exit(
);
}
printf (
%f
(*cosine)(
));
dlclose(handle);
}
如果這個程序名字叫foo
c
那麼用下面的命令來編譯
gcc
o foo foo
c
ldl
(待續
)
by luster
From:http://tw.wingwit.com/Article/program/Oracle/201311/16950.html