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 wasnt 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/libmso 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);
}
如果这个程序名字叫fooc那么用下面的命令来编译
gcc o foo fooc ldl
(待续)
by luster