(十二)插件之dlopen/dlsym/dlclose 加载动态链接库

dlopen, dlsym, dlclose 加载动态链接库

参考:

1. 插件

插件(Plug-in 又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。

应用软件提供使插件能够应用的各项服务,其中包括提供加载方式,使插件可以加载到应用程序和网络传输协议中,从而和插件进行数据交换。

插件必须依赖于应用程序才能发挥自身功能,仅靠插件是无法正常运行的。相反地,应用程序并不需要依赖插件就可以运行,这样一来,插件就可以加载到应用程序上并且动态更新而不会对应用程序造成任何改变。

公开应用程序接口提供一个标准的界面,允许其他人编写插件和应用程序互动。

2. dlopen, dlsym, dlclose 的使用

linux提供了加载和处理动态链接库的系统调用,非常方便。

即: dlopen, dlsym, dlclose

2.1 生成动态链接库

gcc -shared -o libcal.so cal.c

cal.c文件

int add(int a, int b)
{
   return (a+b);
}

2.2 加载动态链接库

gcc -rdynamic -o cal_use cal_use.c -ldl

cal.use.c 文件

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

typedef int (*FUNC)(int,int);

int main(int argc, char **argv)
{
   void *handle;
   //int (*add)(int, int);
   FUNC add;
   char *error;

  handle = dlopen("./libcal.so", RTLD_LAZY);
   if (!handle) {
       fprintf(stderr, "%s\n", dlerror());
       exit(EXIT_FAILURE);
   }

  dlerror();    /* Clear any existing error */

  /* Writing: cosine = (double (*)(double)) dlsym(handle, "cos");
  *  would seem more natural, but the C99 standard leaves
  *  casting from "void *" to a function pointer undefined.
  *  The assignment used below is the POSIX.1-2003 (Technical
  *  Corrigendum 1) workaround; see the Rationale for the
  *  POSIX specification of dlsym().
  */

  //*(void **) (&add) = dlsym(handle, "add");
  add=(FUNC)dlsym(handle,"add");
  if ((error = dlerror()) != NULL)  {
       fprintf(stderr, "%s\n", error);
       exit(EXIT_FAILURE);
   }

  printf("%d\n", (*add)(2,3));
   dlclose(handle);
   exit(EXIT_SUCCESS);
}

2.3 问题

使用gcc编译可以, 但改为g++则运行时出错.

./libcal.so: undefined symbol: add

应该是c++与c相互调用的问题, 需要设置.

只需要在编译动态库的cal.c文件中加入 extern "C"即可.

2.4 小技巧

dlsym找到全局结构体API_STRUCT后,可以直接用这个全局结构体指针来使用库里面的函数.

因为我们有时候提供的库不仅仅是一个两个函数的,一般的一个库都会存在多个函数,用这种方式就可以直接使用, 不然找函数名称的话要写很多次dlsym.

原文地址:https://www.cnblogs.com/walkinginthesun/p/9749911.html

时间: 2024-10-08 02:18:16

(十二)插件之dlopen/dlsym/dlclose 加载动态链接库的相关文章

采用dlopen、dlsym、dlclose加载动态链接库【总结】

摘自http://www.cnblogs.com/Anker/p/3746802.html 采用dlopen.dlsym.dlclose加载动态链接库[总结] 1.前言 为了使程序方便扩展,具备通用性,可以采用插件形式.采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件.linux提供了加载和处理动态链接库的系统调用,非常方便.本文先从使用上进行总结,涉及到基本的操作方法,关于动态链接库的本质及如何加载进来,需要进一步学习,后续继续补充.如何将程序设

【转】采用dlopen、dlsym、dlclose加载动态链接库【总结】

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

加载动态链接库——dlopen dlsym dlclose

DLOPEN?DLMOPEN?DLCLOSE NAME ????dlclose, dlopen, dlmopen - 打开/关闭共享对象 SYNOPSIS #include <dlfcn.h> void *dlopen(const char *filename, int flags); int dlclose(void *handle); #define _GNU_SOURCE #include <dlfcn.h> void *dlmopen (Lmid_t lmid, const

Android插件化(二):使用DexClassLoader动态加载assets中的apk

Android插件化(二):使用DexClassLoader动态加载assets中的apk 简介 上一篇博客讲到,我们可以使用MultiDex.java加载离线的apk文件.需要注意的是,apk中的类是加载到当前的PathClassLoader当中的,如果apk文件过多,可能会出现ANR的情况.那么,我们能不能使用DexClassLoader加载apk呢?当然是可以的!首先看一下Doc文档. A class loader that loads classes from .jar and .apk

从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用

标题:从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用. 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11717254.html 源代码:https://github.com/lamondlu/DynamicPlugins 前景回顾 从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用Application Part动态加载控制器和视图 从零开始实现ASP.NET Core MVC的插件

Struts2的国际化(二)-利用超链接实现动态加载国际化资源文件

原理:程序是根据Locale来确定国际化资源文件,因此关键之处在于知道 Struts2 框架是如何确定 Local 对象的 ! 由于Struts2 使用 i18n 拦截器处理国际化,并且将其注册在默认的拦截器中,因此,可以通过阅读 I18N 拦截器知道. 具体确定 Locale 对象的过程: > Struts2 使用 i18n 拦截器 处理国际化,并且将其注册在默认的拦截器栈中 > i18n拦截器在执行Action方法前,自动查找请求中一个名为 request_locale 的参数. 如果该参

跟王老师学反射(二):Java类的加载、连接和初始化

跟王老师学反射(二):Java类的加载.连接和初始化 主讲教师:王少华   QQ群号:483773664 学习内容: 了解类的加载.连接和初始化 一.类的生命周期 当我们编写一个java的源文件后,经过编译会生成一个后缀名为class的文件,这种文件叫做字节码文件,只有这种字节码文件才能够在java虚拟机中运行,java类的生命周期就是指一个class文件从加载到卸载的全过程.一个java类的完整的生命周期会经历加载.连接.初始化.使用.和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直

office插件安装完成后com加载项中vsto文件不加载

客户电脑安装完插件之后com加载项不显示插件 正常都是会加载出来的 注册表也是有值的 可能是当前用户对office的com组件没有操作权限 解决方案:将注册表路径 "HKEY_CURRENT_USER\Software\Microsoft\Office\Word\Addins\插件名称"  的值复制到 "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\Word\Addins\插件名称"  和 &quo

React-Native系列Android——SoLoader加载动态链接库

SoLoader是facebook出品的一款小巧的用于加载so库文件的开源项目,主要作用是自动检查和加载多个有依赖关系的so库文件.在Android平台下React-Native项目大量使用了动态链接库,即JNI技术,作为Java和Javascript两种程序语言之间的通信桥梁. 解压一个React-Native项目的安装包apk文件,我们可以看到一共有15个so库文件,其中libreactnativejni.so是JNI桥梁的入口. 而libreactnativejni.so又依赖于以下12个