首页 > 系统相关 >Linux dlopen系列函数

Linux dlopen系列函数

时间:2023-06-08 23:36:04浏览次数:53  
标签:函数 句柄 链接库 dlopen Linux 动态链接库 RTLD 加载

Linux提供了一套API来动态装载库,编译时候要加入 -ldl (指定dl库) 

dlopen()函数

函数定义

#include <dlfcn.h>
void *dlopen(const char *filename, int flag);

描述

dlopen() 用于加载以 \0 结尾的字符串文件名命名的动态共享对象(或叫动态链接库),返回一个不透明的句柄,
此句柄与 dlopen API 中的其他函数一起使用,例如 dlopen(), dlsym(), dlclose(), dlerror()。
如果 filename 为 NULL,则返回的句柄是用于主程序的。如果文件名包含斜杠,则将其解释为相对或绝对路径名。
否则动态链接器按顺序在指定目录的搜索动态链接库。
如果 filename 指定的链接库依赖于其他动态链接库,那么动态链接器也会使用相同的规则自动加载这些链接库。
(如果这些链接库又具有依赖关系则此过程可能会递归发生,依此类推)

flag 必须包含以下两个值之一
RTLD_LAZY
执行延迟绑定。仅在执行引用它们的代码时才解析符号。如果该符号从未被引用,则它永远不会被解析。(延迟绑定仅对函数引用执行;当加载动态链接库时,对变量的引用总是立即绑定)


RTLD_NOW
如果指定了此值,或者环境变量 LD_BIND_NOW 设置为非空字符串,则在 dlopen() 返回之前解析动态链接库中的所有未定义符号,如果这不能完成,则返回错误。


flag 也可以输入以下0个或多个值

RTLD_GLOBAL
此动态链接库定义的符号将可用于随后加载的动态链接库的符号解析。
RTLD_LOCAL
这与 RTLD_GLOBAL 相反,如果没有指定标志,则为默认值。 此动态链接库中定义的符号不可用于解析随后加载的动态链接库中的引用。
RTLD_NODELETE (since glibc 2.2)
不要在 dlclose() 期间卸载动态链接库。因此如果稍后使用 dlopen() 重新加载链接库,则不会重新初始化对象的静态和全局变量。
RTLD_NOLOAD (since glibc 2.2)
不要加载动态链接库。这可用于测试对象是否已经被加载到内存(如果不是则 dlopen() 返回 NULL,如果是,则返回链接库的句柄)。此标志还可用于提升已加载的动态链接库上的标志。例如如果以前使用的是 RTLD_LOCAL 标志加载的,则可以用 RTLD_NOLOAD | RTLD_GLOBAL 重新加载一次。
RTLD_DEEPBIND (since glibc 2.3.4)
将此动态库中符号的查找范围置于全局范围之前。这意味着自包含库(self-contained)将优先使用自己的符号,而不是已加载库中包含的同名全局符号。

返回值

成功时,dlopen() 返回一个非 NULL 句柄。出现错误(文件找不到、不可读、格式错误或在加载过程中导致错误)时,返回 NULL。

dlsym()函数

函数定义

#include <dlfcn.h>
void *dlsym(void *handle, const char *symbol);

描述

函数 dlsym(),以 dlopen(3) 返回的动态加载的链接库句柄以及符号名为参数,返回该符号加载到内存中的地址。如果在指定的链接库或在加载该链接库时由 dlopen(3) 自动加载的任何其他链接库中都找不到此符号,则 dlsym() 将返回 NULL。
name为符号名称,可以是函数名称或者全局变量名称

返回值

void* 指向函数的地址,供调用使用。

dlclose()函数

函数定义

#include <dlfcn.h>
int dlclose(void *handle);

描述

dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。

返回值

成功返回0,失败返回非0

标签:函数,句柄,链接库,dlopen,Linux,动态链接库,RTLD,加载
From: https://www.cnblogs.com/zhanggaofeng/p/17467958.html

相关文章

  • Hive-DQL(续)及函数
    Hive--DQL正则匹配正则表达式(Regexp)介绍:概述:​正确的,符合特定规则的字符串.RegularExpression细节:正则表达式不独属于任意的一种语言,市场上大多数的语言都支持正则,例如:Java,Python,HiveSQL,JavaScript等...要求:能用我们讲的规则,看懂别人写的......
  • 【Hive】窗口函数
    窗口函数介绍:概述:窗口函数指的是over()函数,它可以结合特定的函数一起使用,完成不同的功能.​目的/作用:​窗口函数=给表新增一列,至于新增的内容是什么,取决于窗口函数和什么函数一起使用.格式:能和窗口函数一起使用的函数over(partitionby分组字段order......
  • Linux 通过修改 grub 文件禁用节能模式
    1、执行vi/etc/default/grub命令以编辑该文件 将光标移至GRUB_CMDLINE_LINUX行,在rhgb前新增intel_idle.max_cstate=0intel_pstate=disable字段,输入wq命令,按回车即能保存退出。2、生成启动文件 3、将改动写入镜像 最后执行reboot或者shutdown-rnow命令来......
  • Linux系统中GDB调试详细操作方法
    第一:启动在shell下敲gdb命令即可启动gdb,启动后会显示下述信息,出现gdb提示符。添加编译指令:gcc-ga.c-otest打开指令:gdbtest  或者gdb  然后输入:filetest➜examplegdbGNUgdb(Ubuntu8.1.1-0ubuntu1)8.1.1Copyright(C)2018F......
  • linux相关杂记
    find-namename,-inamename:文件名称符合name的文件。iname会忽略大小写find/etc-nameinit(精准查找)find/etc-name*init*(模糊查找,*任何字符)find/etc-nameinit???(模糊查找,?表示单个字符)find/etc-inameinit???(iname不区分大小写)-sizen:......
  • 《循序渐进学运维》第一阶段Linux基础
    前言循序渐进学运维系列,第一阶段的内容已经全部更新完毕。包含学习方法篇,和基础入门课程。所有内容均在csdn存档。想要学习的可以按照这个步骤进行学习,有不完善的地方欢迎在留言区留言,一起交流。第一阶段linux基础学习方法篇Linux运维学习方法篇90后,零基础学习运维,算晚吗?内含书......
  • 【linux】在阿里云服务器上部署网站 WeCenter
    文章目录前言操作环境及以有的架构上传WeCenter软件包解压并传至根目录安装weCenter1.进入阿里云后台,选择域名解析二级域名bbs.zmkjedu.com3.设置apache的配置文件4.开始安装5.全部通过后,点击下一步:6.添加管理员7.安装成功,访问首页总结前言本次实验是在现有网站www.zmkjedu.......
  • 【linux】循序渐进学运维-基础篇-文件权限管理
    写在前面:博主是一名投身教培事业的标准八零后,叛逆而且追求自由,昵称取自于苏轼的《水调歌头》中的“高处不胜寒”,时刻提醒自己要耐得住寂寞,受的了孤独,在技术的道路上,不畏艰难,勇往直前。欢迎star,投稿,交流,后续还会有python系列和java系列。文章目录权限的基础概念权限管理命令1)chmod......
  • 14dayPythonTask7-类与对象+魔法函数
    目录类与对象1.对象=属性+方法2.self是什么?3.Python的魔法方法4.公有和私有5.继承6.组合7.类、类对象和实例对象8.什么是绑定?9.一些相关的内置函数(BIF)练习题魔法方法1.基本的魔法方法2.算术运算符3.反算术运算符4.增量赋值运算符5.一元运算符6.属性访问7.描......
  • MX Linux 23 Beta 正式发布,基于 Debian 12 “Bookworm”
    MX Linux 是一个基于Debian稳定版的中量级Linux操作系统,使用antiX的核心组件,以及由MX社区创建或打包的额外软件。MXLinux23“Libretto”版本的Beta版本已发布,MXLinux23基于即将推出的Debian12“书虫”操作系统系列,由长期支持的Linux6.1LTS内核......