问题标签 [dlopen]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3576 浏览

c++ - 共享对象在主二进制文件中找不到符号,C++

我正在尝试为我编写的程序制作一种插件架构,并且在我第一次尝试时遇到了问题。是否可以从共享对象中访问主可执行文件中的符号?我认为以下会很好:

测试库.cpp:

testexe.cpp:

编译:

输出:

所以很明显,这不好。所以我想我有两个问题:1)有没有办法让共享对象在它加载的可执行文件中找到符号 2)如果没有,使用插件的程序通常如何工作,他们设法在任意共享对象中获取代码在他们的程序中运行?

0 投票
4 回答
365 浏览

c - C共享库问题

背景:

我正在尝试在 C 中开发一个类似于 Zelda (NES) 的简单游戏,作为学习 C 的一种方式。我得出的结论是,将所有游戏数据放在一个文件中并不理想。所以我想做的是将每个“区域”分解成它自己的模块。这个“区域”模块将向主程序描述它的属性,例如瓦片地图,触发某些事件的函数,并调用主程序的游戏 API 来操作演员/声音/等。屏幕上。因此,这些模块必须在运行时加载/卸载。本质上,主程序是一个状态机,它使用从这个“区域”模块提供给它的任何数据。

我试图创建这些共享模块,但似乎主程序中定义的函数对区域模块不可见(至少不在同一范围内)。我确定这是因为我链接不正确。所以我所做的是尝试提出一个可行的概念证明。以下是我失败的概念证明:

api.h

区域.c

游戏.c

构建.sh

建造:

$ ./build.sh

该程序产生:

$ ./游戏

姓名:(空)

我希望看到:名称:区域 1

我想要做的甚至可能吗?如果没有,我还有另一个想法是将所有 API 调用注册到 area 模块……但对我来说,这并不理想。

机器信息:gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3。

0 投票
1 回答
5163 浏览

c++ - dlclose() 不调用全局对象的析构函数

插件1.cpp:

主机.cpp

构建并运行:

为什么 TestStatic::~TestStatic 在 'exit()' 而不是在 'dlclose()' 调用?

0 投票
1 回答
4537 浏览

libtool - 当文件位于正确路径时,dlopen 失败,找不到文件

我有一个使用 libtool 构建的库,它安装到包的库目录中,/usr/local/lib/myprog/libmylib.so. 我正在使用 libltdl 在我的代码中动态加载库。当我尝试在一台机器上加载这个库时,它工作得很好。另一方面,使用相同的构建和安装在同一位置的库,我收到“找不到文件”错误。

如果我lt_dlforeachfile之前直接调用lt_dlopenext(我用它来加载库),那么我可以通过打印出文件名来查看我需要的库已在搜索路径中找到。但紧接着,加载它失败并出现“找不到文件”错误。有什么建议么?

更新

我尝试切换到使用dlopen并明确指定库的绝对路径。这仍然适用于某些系统,而不适用于其他系统。

0 投票
1 回答
3675 浏览

python - 导入模块时出错,dlopen(): Symbol not found

我用 C 语言编写了一个 python 扩展(实际上是使用 cython,尽管这不是重点),它使用 Mac OSX 中的 AudioUnit 框架。该模块构建正确,但是当我尝试从 python 命令行导入它时,出现以下错误:

加载这个模块时如何告诉python它需要使用AudioUnit框架?

0 投票
1 回答
4974 浏览

unix - 主可执行文件上的 dlopen()/dlsym():它的可移植性如何?

我正在构建一个编译器和一个虚拟机来执行我的字节码。该语言允许绑定外部 C 函数,这些函数可以在一些外部共享对象中定义,以及主编译器/VM 二进制文件(一些基本语言内置)。

我知道我可以使用 dlopen(NULL, ...) 在主可执行文件中动态绑定符号,但是在我strip在二进制文件上运行之后不能。那么我有以下问题:

  1. 有没有办法在剥离的二进制文件上做到这一点?
  2. 一般而言,此功能在 UNIX 系统中的可移植性如何?
  3. 是否有可能以某种方式在 Windows 上做同样的把戏?
  4. 在主可执行文件中动态绑定的任何替代方法?
0 投票
2 回答
2045 浏览

gcc - 覆盖动态库中的函数

您好,我有一个具有全局功能的程序,我想在运行时对其进行自定义。比如说,有许多版本的函数 foo() 分散在共享库中。现在,根据运行时检测到的系统配置,我想使用适当库中的函数。

文件加载器.cpp:

文件 other.cpp:

我用

但是,弱符号不会被覆盖。有什么提示吗?

0 投票
2 回答
3258 浏览

linux - 获取函数指针以在我没有直接加载的共享库中运行

我的 Linux 应用程序 (A) 链接到我没有源代码的第三方共享库 (B)。这个库使用了另一个我没有源代码的第三方共享库(C)。我相信 (B) 使用 dlopen 来访问 (C) 而不是直接链接。我的理由是 (B) 上的 'ldd' 不显示 (C) 并且 objdump -X (B) 显示对 dlopen/dlclose/dlsym 的引用。

我的要求是我需要在我的 (A) 代码中获取一个指向位于 (C) 中的函数 foo() 的函数指针。通常我会为此使用 dlsym ,但我需要传递从 dlopen 返回的句柄,因为 (B) 没有公开这个句柄。

-

对于更大的上下文:我需要修改 (C) 中的函数,以便每次调用其辅助函数 bar()(也位于 (C) 中)时,它还调用具有位于 (A) 中的相同签名的函数相同的参数(基本上将我的代码注入 (C) foo()->bar() 的代码路径。我相信我已经找到了一种使用 gdb 完成此任务的方法,但是为了移植我的 gdb 命令列表,但我'我停留在获取函数指针的步骤上。我也对完成相同任务的替代方案持开放态度,而不是如上所述的确切问题

编辑:写完这篇文章后,我意识到我可以在我的代码中对文件执行另一个 dlopen,并且通过该句柄上的 dlsym 返回的符号应该与通过原始 dlopen 接收到的符号相同,如果我正在阅读 dlopen 手册页正确. 但是,我仍然对更大背景下的建议或帮助感兴趣,如果有更好的方法来解决这个问题

0 投票
1 回答
201 浏览

c++ - C++ 虚拟关键字作为一种避免包含代码单元的方法

目前,我们有一段代码允许服务插件向内核提供通信形式,例如 tcp/ip、udp/ip、usb 等……这些服务插件将通知程序类实例反馈给内核以进行进一步处理。

在当前的实现中,一个服务项目(它是一个在运行时由核心通过 dlopen 和朋友引入的单独的动态链接库)将针对驻留在核心源代码(一个单独的项目)中的 notifier.cpp 文件进行编译。这提供了对通知方法实现的访问权限。这完全没有抱怨。

两个备选方案: 1. 将通知方法实现放在头文件中。2. 将通知方法声明为虚拟并延迟绑定直到运行时。

避免计算开销问题 选项 2 的影响是什么?

我们还有其他选择吗?

谢谢

0 投票
3 回答
7952 浏览

c++ - C/C++ 中的 dlopen 和全局变量

由于一些限制,我被迫在运行时加载用 C 编写的库。第三方为我提供了两个库作为静态存档,我们将其转换为共享对象。我正在使用的应用程序根据一些硬件参数在运行时加载其中一个库。不幸的是,其中一个库主要配置了全局变量。

我已经在使用 dlsym 加载函数引用,但我也可以使用 dlsym 加载对这些全局变量的引用吗?