分类:
dlopen、dlsym和dlclose的使用和举例之前用过这三个函数一直没时间整理一下。今天抽时间整理一下。 1、函数简介 dlopen 基本定义 功能:打开一个动态链接库
dlsym() 根据动态链接库操作句柄与符号,返回符号对应的地址。
包含头文件:
#include <dlfcn.h>
函数定义:
void*dlsym(void* handle,const char* symbol)
函数描述:
dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的地址。使用这个函数不但可以获取函数地址,也可以获取变量地址。
dlclose()
dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。
上述都是摘抄,总结为链接的时候需要用到dl库,编译的时候需要加上dlfcn.h头文件。才能保证编译不会报错。
2、生成动态库
hello.c函数原型:
#include <sys/types.h> typedef struct {
int PrintfHello() const hello_ST_API Hello = {
编译的时候用指令: gcc -shared -o hello.so hello.c
上面的函数是用一个全局结构体hello来指向。在dlsym定义中说不仅可以获取函数的地址,还可以获取全局变量的地址。所以此处是想通过dlsym来获取全局变量的地址。好处自己慢慢体会。 3、dlopen代码 #include <sys/types.h> typedef struct {
hello = dlsym(handle, "Hello"); if (hello && hello->PrintfHello) if (hello && hello->module) dlclose(handle);
编译指令:gcc -o test hello_dlopen.c -ldl
运行./test结果如下。 PrintfHello, 27, hello everyone 可以看到结果正常出来了。
看到没用?dlsym找到全局结构体hello后,可以直接用这个全局结构体指针来使用库里面的函数了,因为我们有时候提供的库不仅仅是一个两个函数的,一般的一个库都会存在多个函数,用这种方式就可以直接使用了。不然找函数名称的话要写多少个dlsym啊? |
|