2019独角兽企业重金招聘Python工程师标准>>>

一、为何使用dlopen

dlopen()是一个强大的库函数。 该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。比如 Apache Web 服务器利用这个函数在运行过程中加载模块,这为它提供了额外的能力。一个配置文件控制了加载模块的过程。这种机制使得在系统中添加或者删除一个模块时,都 不需要重新编译了。

二、使用dlopen

可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定义,并在 dl 库中实现。它需要两个参数:一个文件名和一个标志。文件名可以是我们学习过的库中的 soname。标志指明是否立刻计算库的依赖性。如果设置为 RTLD_NOW 的话,则立刻计算;如果设置的是 RTLD_LAZY,则在需要的时候才计算。另外,可以指定 RTLD_GLOBAL,它使得那些在以后才加载的库可以获得其中的符号。

当库被装入后,可以把 dlopen() 返回的句柄作为给 dlsym() 的第一个参数,以获得符号在库中的地址。使用这个地址,就可以获得库中特定函数的指针,并且调用装载库中的相应函数。

三、相关函数

Linux提供了一套API来动态装载库。下面列出了这些API:

- dlopen,打开一个库,并为使用该库做些准备。
- dlsym,在打开的库中查找符号的值。
- dlclose,关闭库。
- dlerror,返回一个描述最后一次调用dlopen、dlsym,或dlclose的错误信息的字符串。

C语言用户需要包含头文件dlfcn.h才能使用上述API。glibc还增加了两个POSIX标准中没有的API:
- dladdr,从函数指针解析符号名称和所在的文件。
- dlvsym,与dlsym类似,只是多了一个版本字符串参数。

三、关于编译

返回值:

打开错误返回NULL

成功,返回库引用

编译时候要加入 -ldl (指定dl库)

例如

gcc test.c -o test -ldl

参考文档

http://blog.chinaunix.net/uid-10540984-id-3508235.html

https://www.baidu.com/baidu?wd=dlopen%E5%87%BD%E6%95%B0&tn=monline_4_dg&ie=utf-8

转载于:https://my.oschina.net/u/2829875/blog/702389

dlopen函数的用法相关推荐

  1. dlopen与dlsym用法

    dlopen和dlsym是用于打开动态链接库中的函数,将动态链接库中的函数或类导入到本程序中: dlopen函数: 功能:打开一个动态链接库 包含头文件: #include <dlfcn.h&g ...

  2. 关于C语言中的malloc和free函数的用法

    一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...

  3. Python assert断言函数及用法

    Python assert断言函数及用法 Python assert 语句,又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下执行:反之,Pyt ...

  4. python中的counter()、elements()、most_common()和subtract()函数的用法

    python中的counter().elements().most_common()和subtract()函数的用法 counter()方法: class collections.Counter([i ...

  5. Java正则表达式--Matcher.group函数的用法

    https://www.cnblogs.com/jiafuwei/p/6080984.html Java正则表达式--Matcher.group函数的用法 原来,group是针对()来说的,group ...

  6. MapInfo中常用查询函数及用法

    MapInfo中常用查询函数及用法: 函数用途 语法 备注 图层中选点 Str$(obj)="point": Str(String)表示字符串:point表示点: 图层中选线 St ...

  7. Oracle trunc()函数的用法

    --Oracle trunc()函数的用法 /**************日期********************/ 1.select trunc(sysdate) from dual  --20 ...

  8. php error log 函数,php日志函数error_log如何使用 php日志函数error_log用法介绍

    php日志函数error_log如何使用?这篇文章主要介绍了php日志函数error_log用法,结合实例形式分析了php日志函数error_log相关的配置文件设置.函数功能.用法与使用注意事项,需 ...

  9. Python中的map()函数和reduce()函数的用法

    Python中的map()函数和reduce()函数的用法 这篇文章主要介绍了Python中的map()函数和reduce()函数的用法,代码基于Python2.x版本,需要的朋友可以参考下  

最新文章

  1. java SE环境变量配置
  2. Centos7部署ntp服务器同步时间以及直接将本地时间同步为北京时间
  3. MySQL使用可重复读作为默认隔离级别的原因
  4. UART的FIFO功能
  5. 2014/Province_Java_B/2/调和级数
  6. 基于微服务架构的token生成和使用
  7. Linux 命令(81)—— chmod 命令
  8. 8月7日科技联播:人民日报发推欢迎Google回归,李彦宏回应非常有信心再赢一次...
  9. 日志收集系统Elasticsearch,Fluentd , Kibana
  10. 802.11介质访问控制——CSMA/CD协议详解
  11. 贪心算法小记——代理服务器
  12. bzoj2242: [SDOI2011]计算器
  13. 扫雷游戏网页版_《我的世界》简单的两款小游戏 带你回味和同学在电脑课上的时光...
  14. Centos7之安装谷歌浏览器
  15. 天使投资人讨论区块链投资:区块链虚火还是真火?
  16. javaScript jquery完美判断图片是否加载完毕
  17. 108. 将有序数组转换为二叉搜索树
  18. Java map集合实现上一条(篇),下一条(篇)新闻翻篇功能
  19. 磁带机PowerVault LTO-7使用
  20. GAT解读graph attention network

热门文章

  1. 中如何调取api_API(接口)是什么
  2. python宣传图片_宣传图片制作网站
  3. java 漏洞挖掘_Apache Tika命令注入漏洞挖掘
  4. oracle触发器不允许修改数据库,Oracle数据库使用触发器记录表数据修改记录
  5. java中b的平方表示_第七届蓝桥杯Java B——四平方和
  6. linux 记事本程序,Linux记事本操作
  7. for遍历list scala_面试官问:List 如何一边遍历,一边删除?
  8. python中用函数货币转换代码_python将人民币转换大写的脚本代码
  9. android q测试机型,小米9安卓Q系统刷机包开启测试 小米Android Q适配机型一览
  10. django分页模块