linux下so库的加载和使用(dlopen/dlsym/dlclose)

程序员通勤双肩包,下单送全年 CSDN 会员 防泼水面料电脑包,保护笔记本电脑,背负轻便,下单再赠 Coding Plan,看技术干货、查文档、下载源码,一站式搞定学习需求 阅读详情

转载自:http://www.cnblogs.com/gulvzhe/archive/2012/06/27/2565983.html

一. 函数简介

像window调用库文件一样,在linux下,也有相应的API因为加载库文件而存在。它们主要是以下几个函数:

函数名 功能描述
dlopen 打开对象文件,使其可被程序访问
dlsym 获取执行了 dlopen 函数的对象文件中的函数的地址
dlerror 该函数没有参数,它会在发生前面的错误时返回一个字符串,同时将其从内存中清空; 在没有错误发生时返回 NULL,
dlclose

关闭目标文件。如果无需再调用共享对象的话,应用程序可以调用该方法来通知操作系统不再需要句柄和对象引用了。它完全是按引用来计数的,所以同一个共享对象的多个用户相互间不会发生冲突(只要还有一个用户在使用它,它就会待在内存中)。任何通过已关闭的对象的 dlsym 解析的符号都将不再可用


二. 函数

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

dlsym()

功能根据动态链接库操作句柄与符号,返回符号对应的地址。

包含头文件
#include <dlfcn.h>
函数定义
void*dlsym(void* handle,const char* symbol)
函数描述
dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的地址。使用这个函数不但可以获取函数地址,也可以获取变量地址。
handle是由 dlopen打开 动态链接库后返回的 指针,symbol就是要求获取的函数或 全局变量的名称。

dlclose()

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

三. 使用示例

#include <stdio.h>
#include <dlfcn.h>

int main(int argc, char *argv[]){
    void * libm_handle = NULL;
    float (*cosf_method)(float);
    char *errorInfo;
    float result;
    
    // dlopen 函数还会自动解析共享库中的依赖项。这样,如果您打开了一个依赖于其他共享库的对象,它就会自动加载它们。
    // 函数返回一个句柄,该句柄用于后续的 API 调用
    libm_handle = dlopen("libm.so", RTLD_LAZY );
    // 如果返回 NULL 句柄,表示无法找到对象文件,过程结束。否则的话,将会得到对象的一个句柄,可以进一步询问对象
    if (!libm_handle){
        // 如果返回 NULL 句柄,通过dlerror方法可以取得无法访问对象的原因
        printf("Open Error:%s.\n",dlerror());
        return 0;
    }

    // 使用 dlsym 函数,尝试解析新打开的对象文件中的符号。您将会得到一个有效的指向该符号的指针,或者是得到一个 NULL 并返回一个错误
    cosf_method = dlsym(libm_handle,"cosf");
    errorInfo = dlerror();// 调用dlerror方法,返回错误信息的同时,内存中的错误信息被清空
    if (errorInfo != NULL){
        printf("Dlsym Error:%s.\n",errorInfo);
        return 0;
    }

    // 执行“cosf”方法
    result = (*cosf_method)(0.0);
    printf("result = %f.\n",result);
    
    // 调用 ELF 对象中的目标函数后,通过调用 dlclose 来关闭对它的访问
    dlclose(libm_handle);

    return 0;
}

编译如下: gcc -fPIC -shared caculate.c -o libcaculate.so ,在linux上man dlopen可以看到使用说明



dlopen介绍原理 动态加载指的是在程序运行时,动态地加载动态,从而达到不停止程序的情况下,更新程序的功能。C++ 程序在运行时有两种方式加载动态连接:隐式链接显式链接。使用动态链接可以解决静态链接带来的可执行文件过大的问题(每次都要将静态编译进可执行二进制文件)、解决版本不兼容问题、减少内存的使用(仅在必要时加载动态,有点懒加载的味道)。dlopen()函数以指定模式打开指定的动态链接文件,并返回一个句柄给dlsym()的调用进程用以获取函数地址或者全局变量地址。使用dlclose()来卸载打开的 阅读详情

相关推荐

【C++】 dlopen dlsys

dlopen是一款Unix系列操作系统下的动态链接函数,它的主要功能是在程序运行时动态加载指定的共享(也可称为动态链接dlsym是从中查找函数或者变量。

qq_31638535的博客 1406

C函数dlopenLinux加载动态so文件的实现示例

在上面的代码中,我们首先使用dlopen函数加载名为"libexample.so"的动态。最后,我们通过函数指针调用动态中的函数,并使用dlclose函数关闭动态。下面是一个简单的示例,演示了如何使用dlopen函数加载动态,并调用其中的函数。本文提供了一个简单的示例,演示了在Linux使用C函数dlopen加载动态的过程。通过使用dlopen函数,我们可以在程序运行时动态加载使用共享的功能。首先,我们需要创建一个简单的动态,包含一个用于打印字符串的函数。

TechChamp的博客 1144

LINUX下动态链接dlopen dlsym dlclose函数使用说明

编译时候要加入 -ldl (指定dl) dlopen 基本定义 功能:打开一个动态链接 [喝小酒的网摘]http://blog.const.net.cn/a/17154.htm 包含头文件:  #include   函数定义:  void * dlopen( const char * pathname, int mode );  函数描述:  在dlopen的()函数

zhoubl668的专栏:远帆,梦之帆! 4079

dlopen()实现三方的动态加载

目录一、函数介绍 二、实现热更新动态加载也就是运行时加载,即可以在程序运行时由我们决定何时加载指定的模块。这样进程启动时只加载必要的模块就行,减少了内存占用,除此之外最大的优点是,可以实现在不重启程序的情况下,实现模块的重新加载。这种技术也叫做“热更新”。先看一下函数原型功能: 简单的例子实现一下dlopen的动态加载功能:libcaculator.so动态的主要方法如下: 编译打包命令:然后在demo.cc中使用dlopen打开动态并调用相关函数 编译命令:需要链接dl编译报错: 用n

木牛的博客 7701

dlopen系列函数详解

Linux提供了一套API来动态装载。下面列出了这些API: dlopen:该函数将打开一个新,并把它装入内存。该函数主要用来加载中的符号,这些符号在编译的时候是不知道的。这种机制使得在系统中添加或者删除一个模块时,都不需要重新进行编译。 dlsym:在打开的动态中查找符号的值。 dlclose:关闭动态。 dlerror:返回一个描述最后一次调用dlopendlsym,或dlclose的错误信...

Bluenapa的博客 1万+

Linux C/C++如何使用.so动态链接

在某些时候,您可能必须在运行时加载才能使用其功能。 在为程序编写某种插件或模块体系结构时,这种情况最常见。 在Linux C/C++语言中,加载非常简单,只需调用dlopendlsymdlclose就足够了。 动态装载API 动态的运行时加载时通过一系列由动态链接器(dynamic linker)提供的API来实现的,这几个API的实现都是在libdl.so中的,且相关的声明常量定义在头文件<dlfcn.h>中。 下面列出了这些API: dlopen,打开一个,并为使用做些

chen1415886044的博客 8881

使用 `dlopen` 动态加载 `.so` 文件

本文介绍了使用dlopenAPI动态加载.so共享的方法。主要内容包括:1)基本使用流程:加载、获取函数指针、调用函数关闭;2)完整示例演示如何创建包含数学函数的共享并动态加载;3)重要注意事项如符号可见性、错误处理内存管理;4)CMake项目集成方法;5)高级用法如加载实现插件系统。dlopen提供了运行时加载共享的灵活性,适用于需要动态扩展功能的场景,但需要开发者自行管理更多细节。文章通过代码示例详细说明了各步骤的实现方式。

啊渊的专栏 389

Linux下程序制作方法详解

这节我们继续讲解如何在Linux系统上创建我们需要的文件我们编写两个函数并将文件制作成文件,用下面相同的代码分别制作静态共享

公众呺:Linux兵工厂, 加关+私信获取海量Linux干货资料和代码 240

Shared library

shared library

dongkun152的专栏 391

LINUX动态链接高级应用

在《LINUX下动态链接的创建与应用》一文中,我介绍了LINUX动态链接的基本知识.其要点是:用户根据实际情况需要,利用dlopen,dlsym,dlclose等动态链接操作函数,装入指定的动态链接中指定的函数,然后加以执行.程序中使用很少的动态函数时,这样的做法尚可.如果程序需要调用大量的动态函数,那么采用这样的编程手段将是非常繁复的,所以我们必须使用一种更为聪明的办法,以减少代码量,提

154

LINUX下动态链接使用dlopen/dlsym/dlclose/dlerror)

dlopen 功能:打开一个动态链接 包含头文件:#include <dlfcn.h> 函数定义:void * dlopen( const char * pathname, int mode ); 函数描述:在dlopen的()函数以指定模式打开指定的动态连接文件,并返回一个句柄给调用进程。使用dlclose()来卸载打开的。 mode:   RTLD_LAZY ...

$好记性还是要多记录$ 9170

Linux应用编程-动态加载动态 dlopen dlsym dlclose

动态加载so dlopen dlsym dlclose

hinewcc的博客 2635

Linuxdlopendlsymdlclose、dlerror函数

编译时候要加入 -ldl (指定dl) dlopen 基本定义 功能:打开一个动态链接 [喝小酒的网摘]http://blog.const.net.cn/a/17154.htm 包含头文件: #include <dlfcn.h> 函数定义: void * dlopen( const char * pathname, int mode ); 函数描述: 在dlopen的()函数以指定...

LPetitPrince's Blog 3182

通俗易懂说:dlopendlsymdlclose动态链接加载

通俗易懂说:dlopendlsymdlclose动态链接加载1. 什么是插件?2. 动态链接加载dlopendlsymdlclose2.1 dlopen2.2 dlsym2.3 dlclose3. 代码实现4. 参考 1. 什么是插件? 插件定义: 采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接的形式加载进来,这就是所谓的插件。 插件应用: 为了使程序方便扩展,...

哈尼的博客 3431

linuxdlopendlsymdlclose使用举例

之前用过这三个函数一直没时间整理一下。今天抽时间整理一下。 1、函数简介 dlopen 基本定义 功能:打开一个动态链接   包含头文件:   #include <dlfcn.h>   函数定义:   void * dlopen( const char * pathname, int mode );   函数描述:   在dlopen的()函数以指定模式打开指定...

随意的风的专栏 2189

linux中的显式运行时链接---dlopendlsym、dlerror、dlclose搞起

        之前, 我们在linux下制作过动态, 并卖过。 当时我们采用的是隐式链接, 也就是说, 在代码中, 我们不用去管如何打开动态、如何链接(这些活都交给了链接器), 只需要管如何调用就行。  隐式链接的动态被进程加载到内存后, 就一直站着这个坑, 直到进程终结。 费时费力, 浪费地盘, 而且不灵活。       于是, 一种动态加载(程序中指定加载)的方式就出现了, 这就是我们...

认知 行动 坚持 8229

linux动态函数dlopendlsym使用

为了使程序方便扩展,具备通用性,可以采用插件形式。采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接的形式加载进来,这就是所谓的插件。 linux提供了加载处理动态链接的系统调用,主要涉及四个函数,函数介绍如下: dlopen()函数 功能:打开一个动态链接[喝小酒的网摘]http://blog.const.net.cn/a/17154.htm 包含头文件: #include <dlfcn.h> 函数定义: void * dlopen( const c...

tecoes的博客 9839

[Linux]使用dlopendlsymdlclose操作访问动态链接

为了使程序方便扩展,具备通用性,可以采用插件形式。采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接的形式加载进来,这就是所谓的插件。linux提供了加载处理动态链接的系统调用,非常方便。本文先从使用上进行总结,涉及到基本的操作方法,关于动态链接的本质及如何加载进来,需要进一步学习,后续继续补充。如何将程序设计为插件形式,挖掘出主题业务之间的关系,需要进一步去学习。 L

lngag110的专栏 1701

LINUX下动态链接使用-dlopen dlsym dlclose dlerror【zt】

dlopen 基本定义   功能:打开一个动态链接   包含头文件:   #include   函数定义:   void * dlopen( const char * pathname, int mode );   函数描述:   在dlopen的()函数以指定模式打开指定的动态连接文件,并返回一个句柄给调用进程。使用dlclose()来卸载打开的

jernymy的专栏 5万+
上一篇: STL学习笔记-迭代器
下一篇: linux ioctl()函数详解
Zenhobby
博客等级 码龄16年 468粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值