linux下so库的加载和使用(dlopen/dlsym/dlclose)
来源:互联网 发布:动画知已图片 编辑:程序博客网 时间:2024/06/15 16:18
转载自:http://www.cnblogs.com/gulvzhe/archive/2012/06/27/2565983.html
一. 函数简介
像window调用库文件一样,在linux下,也有相应的API因为加载库文件而存在。它们主要是以下几个函数:
dlopen
函数的对象文件中的函数的地址关闭目标文件。如果无需再调用共享对象的话,应用程序可以调用该方法来通知操作系统不再需要句柄和对象引用了。它完全是按引用来计数的,所以同一个共享对象的多个用户相互间不会发生冲突(只要还有一个用户在使用它,它就会待在内存中)。任何通过已关闭的对象的 dlsym
解析的符号都将不再可用
二. 函数
dlopen
功能:打开一个动态链接库
包含头文件:
#include <dlfcn.h>
函数定义:
void * dlopen( const char * pathname, int mode );
函数描述:
在dlopen的()函数以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程。使用dlclose()来卸载打开的库。
mode:分为这两种
RTLD_LAZY 暂缓决定,等有需要时再解出符号
RTLD_NOW 立即决定,返回前解除所有未决定的符号。
RTLD_LOCAL
RTLD_GLOBAL 允许导出符号
RTLD_GROUP
RTLD_WORLD
返回值:
打开错误返回NULL
成功,返回库引用
编译时候要加入 -ldl (指定dl库)
dlsym()
功能:根据动态链接库操作句柄与符号,返回符号对应的地址。
dlclose()
dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。
三. 使用示例
#include <stdio.h>#include <dlfcn.h>int main(int argc, char *argv[]){ void * libm_handle = NULL; float (*cosf_method)(float); char *errorInfo; float result; // dlopen 函数还会自动解析共享库中的依赖项。这样,如果您打开了一个依赖于其他共享库的对象,它就会自动加载它们。 // 函数返回一个句柄,该句柄用于后续的 API 调用 libm_handle = dlopen("libm.so", RTLD_LAZY ); // 如果返回 NULL 句柄,表示无法找到对象文件,过程结束。否则的话,将会得到对象的一个句柄,可以进一步询问对象 if (!libm_handle){ // 如果返回 NULL 句柄,通过dlerror方法可以取得无法访问对象的原因 printf("Open Error:%s.\n",dlerror()); return 0; } // 使用 dlsym 函数,尝试解析新打开的对象文件中的符号。您将会得到一个有效的指向该符号的指针,或者是得到一个 NULL 并返回一个错误 cosf_method = dlsym(libm_handle,"cosf"); errorInfo = dlerror();// 调用dlerror方法,返回错误信息的同时,内存中的错误信息被清空 if (errorInfo != NULL){ printf("Dlsym Error:%s.\n",errorInfo); return 0; } // 执行“cosf”方法 result = (*cosf_method)(0.0); printf("result = %f.\n",result); // 调用 ELF 对象中的目标函数后,通过调用 dlclose 来关闭对它的访问 dlclose(libm_handle); return 0;}
编译如下: gcc -fPIC -shared caculate.c -o libcaculate.so ,在linux上man dlopen可以看到使用说明
- linux下so库的加载和使用(dlopen/dlsym/dlclose)
- linux下dlopen的使用 dlopen dlsym dlclose解析
- Linux系统下的dlopen、dlsym、dlclose
- dlopen、dlsym和dlclose的使用
- dlopen,dlsym,dlclose的使用
- LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror【zt】
- LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror
- LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror
- LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror
- LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror【zt】
- linux下动态链接库的使用-dlopen dlsym dlclose dlerror
- linux下动态链接库的使用-dlopen dlsym dlclose dlerror
- LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror
- LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror【zt】
- LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror
- LINUX下动态链接库的使用-dlopen() dlsym() dlclose() dlerror()
- 采用dlopen、dlsym和dlclose加载动态库
- Linux/Unix下采用dlopen、dlsym、dlclose加载动态链接库
- 我的python手册
- js倒计时
- CodeForces 779 A.Pupils Redistribution(水~)
- 【C++】【LeetCode】70. Climbing Stairs
- centos6.5 桥接模式下的静态ip配置
- linux下so库的加载和使用(dlopen/dlsym/dlclose)
- maven创建多模块项目——命令行方式
- Android音频系统之AudioFlinger(一)
- es6中Class的静态方法详解
- Centos系统下安装配置SVN
- Bootstrap标签页和工具提示插件
- Flex配置文件-messaging-config.xml
- Windows和Ubuntu双系统完全独立(双硬盘)的安装方法
- MFC之旅——CMenu