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)相关推荐

  1. 动态加载的函数库Dynamically Loaded (DL) Libraries

    动态加载的函数库Dynamically loaded (DL) libraries是一类函数库,它可以在程序运行过程中的任何时间加载.它们特别适合在函数中加载一些模块和plugin扩展模块的场合,因为 ...

  2. How to download dynamically loaded content using python

    原文链接 Introduction When you surf online, you occasionally visit websites that show content like video ...

  3. 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 ...

  4. linux .so文件详解

    转载▼ linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,和dll差不多 ...

  5. LINUX之静态库共享库

    linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,和dll差不多 .a为 ...

  6. linux .so文件

    相册 广场 登录 注册 关注此空间 buptwinnie的空间 生活从linux开始..... 2011-11-17 10:04 [转]linux .so文件 linux下文件的类型是不依赖于其后缀名 ...

  7. gcc 生成动态链接库

    http://blog.csdn.net/ngvjai/article/details/8520840 Linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows ...

  8. 用gcc编译生成动态链接库*.so文件的方法。

    linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,和dll差不多 .a为 ...

  9. 用gcc编译生成动态链接库*.so文件的方法

    linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,和dll差不多 .a为 ...

最新文章

  1. 怎么连接屏幕_手机屏幕坏了也可以操作?这办法学会了再不怕碎屏
  2. 四则运算个人项目反思总结
  3. composer 笔记
  4. 基于vue的无缝滚动组件
  5. css 浮动效果 0302
  6. 用lsof恢复已删除的文件
  7. python类2继承-抽象-多态
  8. 数据绑定(九)Binding的数据校验
  9. 主流量化交易的几种策略模型
  10. 电视盒子为啥不安装鸿蒙,电视盒子视频播放不了怎么办?只需三步轻松解决!...
  11. 页面中文乱码,tomcat服务器,jsp乱码
  12. 下百度文库要券?来用 Python 自动下
  13. hdu 5755 Gambler Bo 三进制高斯消元(开关问题变形)
  14. 我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误
  15. c语言实现24位彩色图像二值化
  16. 星级评分原理 N次重写的分析
  17. 头痛的apk卡顿,我该从哪些方面进行优化?带你了解常见方案
  18. Authorware自制拼图游戏
  19. 【教程】browsermob-proxy 基于Java的代理服务 配合selenium使用
  20. EMIS系统理论及简单理解(后续持续添加)

热门文章

  1. 完美解决KMplayer无法播放RMVB、RM电影问题
  2. 国内主流比价网站测试分析报告
  3. websocket没准备好如何解决_看完让你彻底搞懂Websocket原理
  4. Hadoop即将过时了吗?
  5. 压缩文件的自动加密怎么解除
  6. 如何给自己制订一个“可实现的”新年目标?
  7. 手机GPS天线设计对GPS定位有影响
  8. Teraterm终端登录CentOS,中文乱码问题解决方法
  9. 无敌!阿里巴巴开源落地可实操项目:网约车+咚宝商城+英雄传说
  10. IDEA日常填坑:Cannot resolve plugin org.apache.maven.plugins:maven-war-plugin