扩展阅读
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • linux命令大全详细分类介绍及常用linux命令文档手册下载
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在没有linux的盘,只有DOS启动盘)
  • Docker官方镜像将会使用Alpine Linux替换Ubuntu
  • 如何让win2000和linux共存。我装好WIN2000,再装LINUX7.0,但LILO只能找到LINUX,不能引导WIN2000
  • linux僵尸(zombie)进程介绍及清除
  • 在windows中的VMware装了个linux,主板有两个串口,能做windows和linux的串口通信测试么,怎么测试这两个串口在linux是有效
  • Linux/CentOS下的CST和UTC时间的区别以及不一致的解决方法
  • 我们网站的服务器从windows2000迁往linux,ASP程序继续使用,可是我连LINUX的皮毛都不了解,大家告诉我LINUX下怎么建网站??
  • unix/Linux下c++ boost thread库读写锁介绍
  • 中文Linux与西文Linus分别哪一个版是权威?I认为是:中科软的白旗Linux与西文的绿帽子Linux!大家的看法呢?
  • linux bash shell命令:grep文本搜索工具简介
  • Windows2000和Linux双操作系统,Linux系统有问题,我直接把Linux分区删除后,Windows2000进不去了,怎么办???
  •  
    当前位置:  编程语言>c/c++

    Linux下c函数dlopen实现加载动态库so文件代码举例

     
        发布时间:2013-8-15  


        本文导语:  dlopen()是一个强大的库函数。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了。...

        dlopen()是一个强大的库函数。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了。可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定义,并在 dl 库中实现。它需要两个参数:一个文件名和一个标志。文件名就是一个动态库so文件,标志指明是否立刻计算库的依赖性。如果设置为 RTLD_NOW 的话,则立刻计算;如果设置的是 RTLD_LAZY,则在需要的时候才计算。另外,可以指定 RTLD_GLOBAL,它使得那些在以后才加载的库可以获得其中的符号。当库被装入后,可以把 dlopen() 返回的句柄作为给 dlsym() 的第一个参数,以获得符号在库中的地址。使用这个地址,就可以获得库中特定函数的指针,并且调用装载库中的相应函数。

       在dlopen()函数以指定模式打开指定的动态连接文件,并返回一个句柄给调用进程。使用dlclose()来卸载打开的库。

    mode是打开方式,其值有多个,不同操作系统上实现的功能有所不同,在linux下,按功能可分为三类:

    1 解析方式

    RTLD_LAZY:在dlopen返回,对于动态库中的未定义的符号不执行解析(只对函数引用有效,对于变量引用总是立即解析)。

    RTLD_NOW: 需要在dlopen返回前,解析出所有未定义符号,如果解析不出来,在dlopen会返回NULL错误为:: undefined symbol: xxxx.......

    2 作用范围,可与解析方式通过“|”指针 iis7站长之家使用

    RTLD_GLOBAL:动态库中定义的符号可被其后打开的其它库重定位

    RTLD_LOCAL: 与RTLD_GLOBAL作用相反,动态库中定义的符号不能被其后打开的其它库重定位。如果没有指明是RTLD_GLOBAL还是RTLD_LOCAL,则缺省为RTLD_LOCAL。

    3 作用方式

    RTLD_NODELETE: 在dlclose()期间不卸载库,并且在以后使用dlopen()重新加载库时不初始化库中的静态变量。这个flag不是POSIX-2001标准。

    RTLD_NOLOAD: 不加载库。可用于测试库是否已加载(dlopen()返回NULL说明未加载,否则说明已加载),也可用于改变已加载库的flag,如:先前加载库的flag为RTLD_LOCAL,用dlopen(RTLD_NOLOAD|RTLD_GLOBAL)后flag将变成RTLD_GLOBAL。这个flag不是POSIX-2001标准。

    RTLD_DEEPBIND:在搜索全局符号前先搜索库内的符号,避免同名符号的冲突。这个flag不是POSIX-2001标准。


    函数返回值:

       打开错误返回NULL

       成功,返回库引用

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


    具体代码举例如下:

    #include "stdio.h"
    #include <dlfcn.h>
    int main(int argc,char *argv[])
    {
        char module_name[1024]={"./test_module.so"};
        char *error=NULL;
        void *module_handle = dlopen(module_name, RTLD_NOW);
        if(module_handle == NULL)
        {
          error = dlerror();
          char tp[1024] = {0};   
          snprintf(tp, 256,
         "Load module "%s" error: %sn",
         module_name, error);     
          printf("%s",tp);
          return 1;
        }else
        {
            printf("Load module[%s] success!rn",module_name);
        }
        return 1;
    }


    • 本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
      本站(WWW.)站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.
      转载请注明:文章转载自:[169IT-IT技术资讯]
      本文标题:Linux下c函数dlopen实现加载动态库so文件代码举例
    相关文章推荐:
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • 请教一下Linux的动态库加载方式(是启动加载还是运行加载?)
  • 武宗涛 linux nor flash驱动如何加载?为什么系统中没有mtdcore.c文件,按理说应该是加载模块方式能行啊?求问,到底怎么回事啊?
  • 要写一个Linux下的elf加载器需要哪些知识?
  • linux网卡驱动加载异常
  • ARM开发板上LINUX系统 加载 .ko 驱动?
  • linux内核模块的加载顺序
  • linux下获取动态库的加载路径
  • linux 启动加载项
  • linux2.6内核 如何自动加载当前所需要的模块
  • 我用linux9怎么加载不了usb啊.....
  • 虚拟机下的Linux加载U盘出错
  • 怎么让LINUX启动自动加载WINDOWS分区?
  • linux加载地址问题
  • 在linux操作系统中,如何实现可加载的模块是否被卸载的检测
  • VMware中linux无法正常加载iso文件
  • linux生成(加载)动态库静态库和加载示例方法
  • Linux下如何加载 U盘??
  • RedHat Linux9下面如何加载NTFS分区?
  • 请教linux中如何自动加载自己的模块
  • LINUX下加载QQ插件的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3