dlopen linux 实例_Linux下c函数dlopen实现加载动态库so文件代码举例
dlopen()是一个强大的库函数。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了。可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定义,并在 dl 库中实现。它需要两个参数:一个文件名和一个标志。文件名就是一个动态库so文件,标志指明是否立刻计算库的依赖性。如果设置为 RTLD_NOW 的话,则立刻计算;如果设置的是 RTLD_LAZY,则在需要的时候才计算。另外,可以指定 RTLD_GLOBAL,它使得那些在以后才加载的库可以获得其中的符号。当库被装入后,可以把 dlopen() 返回的句柄作为给 dlsym() 的第一个参数,以获得符号在库中的地址。使用这个地址,就可以获得库中特定函数的指针,并且调用装载库中的相应函数。由 www.169it.com 搜集整理
在dlopen()函数以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程。使用dlclose()来卸载打开的库。
mode是打开方式,其值有多个,不同操作系统上实现的功能有所不同,在linux下,按功能可分为三类:
1 解析方式
RTLD_LAZY:在dlopen返回前,对于动态库中的未定义的符号不执行解析(只对函数引用有效,对于变量引用总是立即解析)。
RTLD_NOW: 需要在dlopen返回前,解析出所有未定义符号,如果解析不出来,在dlopen会返回NULL,错误为:: undefined symbol: xxxx.......
2 作用范围,可与解析方式通过“|”组合使用
RTLD_GLOBAL:动态库中定义的符号可被其后打开的其它库重定位。
RTLD_LOCAL: 与RTLD_GLOBAL作用相反,动态库中定义的符号不能被其后打开的其它库重定位。如果没有指明是RTLD_GLOBAL还是RTLD_LOCAL,则缺省为RTLD_LOCAL。
3 作用方式
RTLD_NODELETE: 在dlclose()期间不卸载库,并且在以后使用dlopen()重新加载库时不初始化库中的静态变量。这个flag不是POSIX-2001标准。
RTLD_NOLOAD: 不加载库。可用于测试库是否已加载(dlopen()返回NULL说明未加载,否则说明已加载),也可用于改变已加载库的flag,如:先前加载库的flag为RTLD_LOCAL,用dlopen(RTLD_NOLOAD|RTLD_GLOBAL)后flag将变成RTLD_GLOBAL。这个flag不是POSIX-2001标准。
RTLD_DEEPBIND:在搜索全局符号前先搜索库内的符号,避免同名符号的冲突。这个flag不是POSIX-2001标准。
函数返回值:
打开错误返回NULL
成功,返回库引用
编译时候要加入 -ldl (指定dl库)
具体代码举例如下:
dlopen linux 实例_Linux下c函数dlopen实现加载动态库so文件代码举例相关推荐
- linux平台 加载动态库dlsym返回null
linux 平台加载动态库通常使用dlopen,dlsym,dlclose三个函数实现 最近写了一个小程序,遇到dlsym总是调用失败返回空值,查找了很多相关的资料,确定动态库的创建有问题.下面是最初 ...
- Linux系统程序运行时加载动态库路径顺序
程序运行时加载动态库路径顺序(Linux) 在linux系统中,如果程序需要加载动态库,它会按照一定的顺序(优先级)去查找: 链接时路径(Link-time path)和运行时路径(Run-time ...
- linux直接运行程序加载动态库失败,扣丁学堂Linux培训详解程序运行时加载动态库失败解决方法...
今天扣丁学堂Linux培训老师给大家介绍一下关于Linux程序运行时加载动态库失败的解决方法,希望对同学们学习有所帮助,下面我们一起来看一下吧. Linux下不能加载动态库问题 当出现下边异常情况 . ...
- linux加载动态库问题
当我们在linux系统引用动态库时,经常会遇到一个问题,加入我们需要的动态库没有在系统的默认目录下,我们编译时使用-L指定了动态库的路径,编译时没有问题,但是执行调用该动态库的可执行文件时,却提示找不 ...
- dlopen linux 实例_Linux静态库和动态库
库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 静态库和动态库的区别 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大 ...
- linux中动态加载动态库的方法
功能:打开一个动态链接库 包含头文件: #include <dlfcn.h> 函数定义 : void * dlopen( const char * pathname , int mod ...
- linux下项目开发加载动态库:ldconfig与 /etc/ld.so.conf
场景:自己开发一个项目,程序里包含一些自定义动态库.运行,需要加载这些动态库. 假如这些库在/pro/output/lib/下面,可执行程序在/pro/output/bin/下面. 那么,我们需要: ...
- Linux添加相对库路径,Linux C编程(8) 使用相对路径加载动态库-rpath和$ORIGIN
商业程序如何加载自己的so 使用LD_LIBRARY_PATH的缺点是要实现设置LD_LIBRARY_PATH.不够自动化.那么大型的商业程序是如何加载自己的so呢. 这里以QtCreator为例. ...
- java jsp 页面下拉框 ajax异步加载数库数据
全面详细的新手下拉框数据显示.web项目中难免用到下拉框异步加载数据的情况.这里分享一个.使用的是jquery的ajax异步加载后台数据.后台使用java语言. 1,先看效果,下拉框如下: 2.获取值 ...
最新文章
- 小红书做直播的背后,隐藏了什么秘密?
- 属性总结(三):plt.rcParams
- OpenCV3.2+VS2013+Tesseract3.02.02配置
- 【Elasticsearch】 es 索引 内置 字段 _source
- bat获取命令返回值_全网都在找的redis字符串命令,总结在这了
- 分析微信小程序生成二维码接口报错41030: invalid page hint
- 服务器硬盘一直亮红灯怎么回事,请问:电脑的硬盘为何一直亮着红灯?且硬盘很 – 手机爱问...
- MATLAB如何导出高分辨率的模型图片、PDF
- ps 打开失败 提示:暂存盘已满
- SPSS(七)非线性回归过程
- 企业如何通过TPM管理降低设备维修费用?
- 中国大学MOOC-陈越、何钦铭-数据结构-习题解答-04 树(中)
- 计算机网络:从入门到放弃
- 【期末大作业】基于HTML+CSS+JavaScript南京大学网页校园教育网站html模板(3页)
- Android平台上的PacketSender
- 21根火柴常胜将军c语言,常胜将军算法
- 一个跑步时用的轨迹记录和计步器APP
- PHP将word文件转为图片预览
- python记录程序运行时间的三种方法
- 笛卡尔坐标变换: UVA1602
热门文章
- idea中,git的cherry-pick怎么用?
- HDU 1237 求一个连通图中的哈密顿回路数(同一个状态下的哈密顿回路数)
- log4j:WARN No appenders could be found for logger 解决方案
- DO447使用过滤器和插件转换器--使用过滤器处理变量
- 华东师大计算机专业考研难度,华东师范大学考研有多难?
- Unity Xlua 之 Lua调用C#(三)
- 2023年 中国制造业这三大趋势不可忽视
- 崩坏3九游服务器稳定吗,《崩坏3》卡级真的有必要吗 高级区红莲是什么样子
- dSploit—Android网络***套件测试小记(含视频)
- 大学生校园生活心得感悟