Dynamically Loaded (DL)
Dynamically Loaded (DL)
简而言之,共享对象通过dlopen动态打开动态库的加载完成后,返回一个句柄,通过dlsym定位到你需要执行的函数指针然后可以在程序中使用
dlopen -- open a dynamically linked library
dlsym -- get the address of a symbol in a dynamically linked library
<span courier="" new";="" mso-hansi-font-family:"courier="" new";mso-bidi-font-family:"courier="" color:blue;background:white;mso-font-kerning:0pt"="" style="word-wrap: break-word; font-size: 10pt; font-family: 宋体;">例子void *handle;
int i, *iptr;
int (*fptr)(int);
/* open the needed object */
handle = dlopen("/usr/mydir/libx.so", RTLD_LAZY);
/* find address of function and data objects */
fptr = (int (*)(int))dlsym(handle, "some_function");
iptr = (int *)dlsym(handle, "int_object");
/* invoke function, passing value of integer as a parameter */
i = (*fptr)(*iptr);
参考资料http://topic.csdn.net/u/20090422/17/2ddcab88-2d50-478a-9b2e-2c2978ad604b.html
http://hi.baidu.com/janefei1603/blog/item/72ae708eed638eda503d923b.html
Additional link: http://tldp.org/HOWTO/Program-Library-HOWTO/dl-libraries.html
具体实现
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库)
例如
gcc test.c -o test -ldl
编辑本段
使用 dlopen
dlopen()是一个强大的库函数。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。比如Apache Web 服务器利用这个函数在运行过程中加载模块,这为它提供了额外的能力。一个配置文件控制了加载模块的过程。这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了。
可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定义,并在 dl 库中实现。它需要两个参数:一个文件名和一个标志。文件名可以是我们学习过的库中的 soname。标志指明是否立刻计算库的依赖性。如果设置为 RTLD_NOW 的话,则立刻计算;如果设置的是 RTLD_LAZY,则在需要的时候才计算。另外,可以指定 RTLD_GLOBAL,它使得那些在以后才加载的库可以获得其中的符号。
当库被装入后,可以把 dlopen() 返回的句柄作为给 dlsym() 的第一个参数,以获得符号在库中的地址。使用这个地址,就可以获得库中特定函数的指针,并且调用装载库中的相应函数。
dlsym
dlsym()的函数原型是
void* dlsym(void* handle,const char* symbol)
该函数在<dlfcn.h>文件中。
handle是由dlopen打开动态链接库后返回的指针,symbol就是要求获取的函数的名称,函数返回值是void*,指向函数的地址,供调用使用
取动态对象地址:
#include <dlfcn.h>
void *dlsym(void *pHandle, char *symbol);
dlsym根据动态链接库操作句柄(pHandle)与符号(symbol),返回符号对应的地址。
使用这个函数不但可以获取函数地址,也可以获取变量地址。比如,假设在so中
定义了一个void mytest()函数,那在使用so时先声明一个函数指针:
void (*pMytest)(),然后使用dlsym函数将函数指针pMytest指向mytest函数,
pMytest = (void (*)())dlsym(pHandle, "mytest");
Dynamically Loaded (DL)相关推荐
- 动态加载的函数库Dynamically Loaded (DL) Libraries
动态加载的函数库Dynamically loaded (DL) libraries是一类函数库,它可以在程序运行过程中的任何时间加载.它们特别适合在函数中加载一些模块和plugin扩展模块的场合,因为 ...
- How to download dynamically loaded content using python
原文链接 Introduction When you surf online, you occasionally visit websites that show content like video ...
- C++ dlopen mini HOWTO 一篇非常好的介绍C++ dlopen linux/mac os x 编程的资料
C++ dlopen mini HOWTO 作者:Aaron Isotton <aaron@isotton.com> 2006-03-16 译者:Lolita@linuxsir.org 2 ...
- linux .so文件详解
转载▼ linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,和dll差不多 ...
- LINUX之静态库共享库
linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,和dll差不多 .a为 ...
- linux .so文件
相册 广场 登录 注册 关注此空间 buptwinnie的空间 生活从linux开始..... 2011-11-17 10:04 [转]linux .so文件 linux下文件的类型是不依赖于其后缀名 ...
- gcc 生成动态链接库
http://blog.csdn.net/ngvjai/article/details/8520840 Linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows ...
- 用gcc编译生成动态链接库*.so文件的方法。
linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,和dll差不多 .a为 ...
- 用gcc编译生成动态链接库*.so文件的方法
linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,和dll差不多 .a为 ...
最新文章
- 怎么连接屏幕_手机屏幕坏了也可以操作?这办法学会了再不怕碎屏
- 四则运算个人项目反思总结
- composer 笔记
- 基于vue的无缝滚动组件
- css 浮动效果 0302
- 用lsof恢复已删除的文件
- python类2继承-抽象-多态
- 数据绑定(九)Binding的数据校验
- 主流量化交易的几种策略模型
- 电视盒子为啥不安装鸿蒙,电视盒子视频播放不了怎么办?只需三步轻松解决!...
- 页面中文乱码,tomcat服务器,jsp乱码
- 下百度文库要券?来用 Python 自动下
- hdu 5755 Gambler Bo 三进制高斯消元(开关问题变形)
- 我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误
- c语言实现24位彩色图像二值化
- 星级评分原理 N次重写的分析
- 头痛的apk卡顿,我该从哪些方面进行优化?带你了解常见方案
- Authorware自制拼图游戏
- 【教程】browsermob-proxy 基于Java的代理服务 配合selenium使用
- EMIS系统理论及简单理解(后续持续添加)
热门文章
- 完美解决KMplayer无法播放RMVB、RM电影问题
- 国内主流比价网站测试分析报告
- websocket没准备好如何解决_看完让你彻底搞懂Websocket原理
- Hadoop即将过时了吗?
- 压缩文件的自动加密怎么解除
- 如何给自己制订一个“可实现的”新年目标?
- 手机GPS天线设计对GPS定位有影响
- Teraterm终端登录CentOS,中文乱码问题解决方法
- 无敌!阿里巴巴开源落地可实操项目:网约车+咚宝商城+英雄传说
- IDEA日常填坑:Cannot resolve plugin org.apache.maven.plugins:maven-war-plugin