c++ - 我可以从运行时加载的共享对象访问主机进程的符号吗?还有其他选择吗?

标签 c++ shared-libraries symbols dynamic-loading

在我的场景中,我想要一个插件,它是一个在运行时加载的共享对象,可以从“主机应用程序”访问符号,这样我就可以向我的应用程序添加任何功能。

我试过但没有找到任何方法来做到这一点,我不知道这是否可能。那么,我能否以某种方式做到这一点,或者使用插件的应用程序是否有任何替代方案?

我在 Fedora 15、Linux 2.6.4 上。但是,我希望该解决方案是跨平台的。

最佳答案

主要有以下三种方法:

  1. 将函数指针结构从应用程序传递到 DLL,从而可以访问您想要共享的任何符号。这是最可移植的方法,但是创建所有函数指针有点麻烦。像这样的东西:

    // In shared header
    struct app_vtable {
      void (*appFoo)();
    };
    
    // In plugin:
    const app_vtable *vt;
    void set_vtable(const app_vtable *vt_) {
      vt = vt_;
    }
    
    void bar() {
      vt->appFoo();
    }
    
    // In application:
    void foo();
    const app_vtable vt = { foo };
    
    void loadplugin() {
      void *plugin = dlopen("plugin.so", RTLD_LAZY);
      void (*pset_vtable)(const app_vtable *) = dlsym(plugin, "set_vtable");
    
      pset_vtable(&vt);
    
      void (*pbar)() = dlsym(plugin, "bar");
      pbar();
    }
    
  2. 将您的应用程序移动到一个库中,让可执行文件简单地链接到这个库中并调用其中的一个入口点。然后你的插件可以链接同一个库并轻松访问它的符号。这也非常便携,但由于需要在主应用程序库中使用与位置无关的代码,因此可能会导致一些性能损失(尽管在这种情况下,您可以使用固定映射,具体取决于您的架构) .

  3. 仅在 Linux(以及可能的其他 ELF 平台)上,您可以使用 -rdynamic 直接从应用程序可执行文件中导出符号。然而,这对其他平台的移植性不是很好 - 特别是,这些与 Windows 上的不等同。

关于c++ - 我可以从运行时加载的共享对象访问主机进程的符号吗?还有其他选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7706592/

相关文章:

mysql - 尝试将货币符号添加到 MySQL

c - 如何判断使用哪个版本的英特尔编译器来编译二进制文件

c++ - 在运行 X 窗口程序时没有得到任何输出

C++ 拆分字符串反馈

使用 GNU 工具链 (gcc/ld) 从静态库创建共享库

c# - .NET 转到 NuGet 包的实现

C++ opencv 访问像素值不正确

c++ - goto 的 POD 和规则

linux - linux下动态库共享全局变量吗

c++ - 多个项目引用 MFC : "use mfc in a static library" vs "use mfc in a shared dll"?