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

2023-12-31

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

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

我使用的是 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 上的平台不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 重载<<的返回值

    include
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • 如何使用 TestCafe 和 Yaml 将屏幕截图和视频保存为 Azure Build Pipeline 中的附件?

    我正在尝试在 Azure Devops 中创建一个构建管道 运行在 TestCafe Studio 中创建的测试 保存错误屏幕截图 并保存每次测试的视频 保存测试运行的视频 将测试结果发布到测试运行 将屏幕截图和视频作为附件发布到构建管道和
  • 在经典 ASP 脚本中使用 ADO.NET

    我正在编写一些返回单个值的简单查询 并且我想从经典 ASP 的 ADO 库中获取 ADO NET ExecuteScalar 方法的行为 但是 我不想重新发明轮子 是否可以在经典 ASP 中实例化 ADO NET 的 Command 对象
  • 码头工人。 MySQL 图像。无法更改 my.cnf 文件

    我有这样一个docker compose yml database container name test db image mysql 5 7 volumes docker my cnf etc my cnf environment MY
  • 如何检测 NSString 是否包含特定字符?

    我有一个 NSString 对象 例如 45 0000 现在我想知道这个字符串是否包含 我怎样才能做到这一点 您是否想查找它是否至少包含以下一项 or 您可以使用 rangeOfCharacterFromSet NSCharacterSet
  • 复制没有历史记录的 git 存储库

    我在 GitHub 上有一个私人存储库 我想将其公开 但是 一些初始提交包含我不想公开的信息 硬编码凭据等 在不包含部分或全部提交历史记录的情况下 公开最新提交 我真的不需要或不希望公共存储库中的先前提交 的最简单方法是什么 您可以限制历史
  • 如何在Web应用程序中使复选框只读

    我有一个网格视图 每一行都有一个复选框 当进入编辑模式时 可以选中 取消选中复选框 但我不希望该复选框在任何其他模式下都是可编辑的 用户可能很容易对不反映保存回数据库中的真实值的复选框感到困惑
  • 使用for循环批量重命名文件

    我正在尝试使用 for 循环来重命名文件 Echo Off setlocal enableDelayedExpansion Set Date set mydate DATE 10 4 DATE 4 2 DATE 7 2 Rename fil
  • 拆分逗号分隔的字符串并在 C# 中添加引号 - 优雅的解决方案

    我有一个string看起来像这样 var v 10 14 18 21 并想将其用作如下所示的东西 10 14 18 21 我写了一个函数 它将值分割为comma并将它们作为字符串添加在一起 另外我删除了最后一个 从结果字符串 我把所有东西都
  • DQL 返回实体数组而不是对象

    通常 如果我运行如下所示的 DQL 查询 它将返回实体对象列表 d this gt getDoctrine gt getRepository xxxWebsiteBundle Locations gt createQueryBuilder
  • 为什么用户可以设置新密码,而无需输入与我的批处理代码正确的旧密码?

    我最近写了一个文件夹锁定程序 我唯一的问题是当我需要更改密码时 例如我去部分newpass 该程序似乎不会将旧密码与新密码进行比较 而只是使用给定的任何输入 这违背了拥有密码的目的 因为每个人都可以更改密码 而不是用它解锁文件夹 有人可以仔
  • 在 Chrome 中重新加载动画 GIF 时出现问题

    我有一个可以重新加载 gif 动画的应用程序 它在 Safari 中始终有效 但在 Chrome 中时断时续 我相信这个问题与提到的问题类似here https groups google com forum topic shiny dis
  • Excel - 基于ID的工作表值查找[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有两张工作表 第一个列出了我的客户
  • 如何获取处理器和硬盘的制造序列号和 ID?

    如何使用 Matlab 获取以下硬件属性 主板制造序列号 处理器 ID 处理器制造序列号 硬盘ID 硬盘制造序列号 是否有任何函数或类负责检测其他机器硬件组件属性的属性 我知道可以使用系统或控制台命令来完成 但我不知道如何完成 不过 我更喜
  • 将 1 亿个文件写入 s3

    我的主要目标是根据每条记录的 id 将记录拆分为文件 目前有超过 150 亿条记录 而且肯定还会增加 我需要一个使用 Amazon EMR 的可扩展解决方案 我已经为一个包含大约 9 亿条记录的较小数据集完成了这项工作 输入文件采用 csv
  • Gensim LDA 中的主题明智文档分布

    python 有没有办法映射属于某个主题的文档 例如 主要是 主题 0 的文档列表 我知道有多种方法可以列出每个文档的主题 但我该如何反过来呢 Edit 我正在使用以下 LDA 脚本 doc set for file in files ne
  • 如何在 Visual Studio 2010 中构建这个简单的 C++/SWIG/C# 项目?

    我需要帮助设置一个简单的 C C SWIG 项目 我很难将使用 SWIG 绑定的 C 项目组合在一起 我正在使用 Visual Studio 2010 和最新版本的 SWIG 我的代码很简单 cpp 文件 h pragma once cla
  • 是否有任何方便的代码覆盖率工具可与 JUnit 一起使用?

    是否有方便的代码覆盖率工具可与 JUnit 一起使用 我想大多数代码覆盖率工具都可以很容易地与 JUnit 一起使用 以前我用过EMMA http emma sourceforge net 这很好 如果您是 Eclipse 用户 有一个 E
  • 如何以编程方式清空浏览器缓存?

    我正在寻找一种以编程方式清空浏览器缓存的方法 我这样做是因为应用程序会缓存机密数据 并且我想在您按 注销 时删除这些数据 这可以通过服务器或 JavaScript 发生 当然 仍然不鼓励在外国 公共计算机上使用该软件 因为存在更多危险 例如
  • 如何在 Mongoose 中验证数组及其元素

    我有这个模式 我在其中验证了数组的元素book 但我不知道如何验证数组本身 var DictionarySchema new Schema book 1 type String required true 2 String 3 String
  • 我可以从运行时加载的共享对象访问主机进程的符号吗?还有其他选择吗?

    在我的场景中 我想要一个插件 它是在运行时加载的共享对象 用于访问 主机应用程序 中的符号 以便我可以向我的应用程序添加任何功能 我已经尝试过 但没有找到任何方法来做到这一点 而且我不知道这是否可能 那么 我可以以某种方式做到这一点 或者使