问题标签 [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.
c++ - 具有相对路径的 dlopen 错误
我正在尝试从另一个 .dylib 文件调用 .dylib 文件。它们在同一个文件夹中。我这样做:
void* handle = dlopen("./other.dylib", RTLD_LAZY);
但是句柄结束了 NULL 并且 dlerror() 说它找不到它。但是,如果我使用绝对路径,它可以工作。文档说我可以使用相对路径。我确信我的拼写和大小写是正确的。
为什么会出错?
c - 如何让这个简单的 C 测试程序加载模块工作?
我打算在 linux 上使用 dlopen 和 dlsym 来使这两个源文件工作:
和:
但是当我编译第一个时,它一直说:
main.c:9:错误:需要左值作为赋值的左操作数
编辑:我尝试添加一个演员,并使其成为一个函数指针,但现在它说: main.c:(.text+0x1f): undefined reference to dlopen'
main.c:(.text+0x2b): undefined reference to
dlsym'
c++ - Linux 上的 RTLD_LOCAL 和 dynamic_cast
我们有一个插件,它由应用程序中的一些共享库构成,我们需要在应用程序运行时对其进行更新。出于性能原因,我们在卸载旧插件之前加载并开始使用新插件,并且只有当所有线程都使用旧插件完成时,我们才会卸载它。由于新插件和旧插件的库具有相同的符号,因此我们dlopen()
使用RTLD_LOCAL
. 如果我们不意外地将新插件从内部函数调用到旧插件中的符号。
插件的一个库对由插件dynamic_cast()
的另一个库创建的对象执行。这适用于 HP-UX、AIX、Solaris 和 Windows,但不适用于 Linux。据我所知,这是因为所有这些操作系统(编译器)都使用类的名称来比较类型(在dynamic_cast()
.type_info
对象(因为它是用 加载的RTLD_LOCAL
)地址不同,因此相等的类型似乎不等于dynamic_cast()
.
有没有办法执行以下操作之一:
- 仅
type_info
像提供对象一样加载对象RTLD_GLOBAL
。 - 使编译器使用类名比较而不是
type_info
地址来比较类型。
? 我们使用的编译器是:
c++ - 如何通过 dlopen() 将插件链接到应用程序
我正在为应用程序编写插件。应用程序将使用dlopen()
. 平台是 Fedora Linux 11。我拥有该应用程序的所有源代码。
我已经成功地将我的代码添加到应用程序中,并且它链接得很好,因为整个应用程序都被同时链接了。但是,最终我希望我的代码成为一个单独的插件。
我无法将我的代码构建为插件。我将其构建为共享(.so)库。g++
-L
我的代码自然引用了应用程序中的符号,因此我需要使用and-l
选项指定插件链接到的库。但是,接受我的插件的应用程序是一个可执行文件,而不是一组 .so 库。
我在这里遗漏了一些基本观点。如何链接我的插件?
请注意,我仍在尝试构建我的插件——我还没有到尝试使用dlopen()
.
解决方案:谢谢大家的回答。我使用了 nemo 建议的 --just-symbols 方法,效果很好。谢谢!
shared-libraries - 是什么导致 sprof 抱怨“ld.so 检测到不一致”?
我正在尝试使用 sprof 来分析一些软件(ossim),其中几乎所有代码都在共享库中。我已经生成了一个分析文件,但是当我运行 sprof 时,我收到以下错误:
我遵循的说明说我需要 libc 版本至少 2.5-34,我有 libc 版本 2.12.2(Gentoo,内核 2.6.36-r5)。
我找不到关于错误意味着什么或(更有趣的是)如何修复它的任何解释,唯一半相关的谷歌结果是旧版本 Skype 中的错误。
c - 在控制进入共享库之前捕获系统调用
我已经包装了一些系统调用函数,如 write()、open() 等,LD-PRELOAD 用于覆盖原始系统调用。此外,我还定义了一些函数,并将其变成了一个 shred 库。
我想在它们进入共享库之前捕获来自不同应用程序进程对这些共享库的所有系统调用。我怎样才能做到这一点?
谢谢
c - 如何从我的库中调用可执行文件中的函数?
我有一个可执行文件和一个动态库(.so)。该库导出一些符号并且可执行文件成功调用它。但我想让库调用可执行文件的功能成为可能。我试图在可执行文件中执行以下操作:
这在图书馆:
但是当我调用dlopen
可执行文件(加载库)时,它返回错误undefined symbol: print
。我该如何解决?
c++ - c++动态库dlopen报错
我有两个文件:RollDice.cpp
RollDice.h:
我使用以下命令创建 .so 文件: g++ -shared -o RollDice.so RollDice.cpp
现在在我的应用程序中,我想打开这个插件:
但我收到消息:无法加载库:./RollDice.so: 无效的 ELF 标头
你能帮我解决这个问题吗?
-fPIC
没有帮助
编辑:
现在我正在构建插件:
我有新问题:无法加载符号创建:./RollDice.so:未定义符号:创建
当我nm
用来查看 RollDice.so 中的符号时,我看不到“创建”
c++ - 如何找到使用 dlopen() 打开的库的覆盖范围?
我有一个 C++ 库 (.so),它由另一个应用程序使用 dlopen() 打开。但是我需要在使用 gcov 的应用程序中运行时找到这个库的代码覆盖率。可能吗?如果是,怎么做?
如果不是,该问题如何解决?
c - dlopen/dlsym/dlclose (dlfcn.h) 导致内存泄漏
像这样使用 dlfcn 系列时:
它会导致内存泄漏:
我的问题是,这是编程错误,还是 dlfcn/libdl.so 中的错误?