问题标签 [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,我如何应对已加载的库文件的更改?
我有一个用 C++ 编写的程序,它使用 dlopen 加载动态库(Linux、i386、.so)。随后修改库文件时,我的程序往往会崩溃。这是可以理解的,因为大概文件只是映射到内存中。
我的问题是:除了简单地为自己创建文件的副本并将其删除之外,我是否有办法加载对后续修改安全的共享对象,或者从对我已加载的共享对象的修改中恢复的任何方法?
澄清:问题不是“我怎样才能安装一个新的库而不使程序崩溃”,而是“如果我无法控制的人正在复制库,我可以防御吗?”
linux - linux dlopen:加载时可以“通知”库吗?
有没有办法让共享库在加载时得到“通知”?
换句话说,假设我在共享库上使用dlopen,是否有一个在共享库上自动调用(如果存在)的函数(例如 main?)
linux - 动态加载时的库路径?
如何从库本身中获取共享库的路径?
换句话说,假设库 X 是使用 加载的dlopen()
,我如何才能访问用于从库本身中加载所述库的路径?
请注意,我不能让首先加载库的代理将这个参数交给我。
更新:这是使用静态变量的方法:
linux - 禁用对“exec”功能的访问?
假设我有一个加载动态库“L”的进程“A”。
问:有没有办法禁止对“L”内部函数的“exec”函数的访问?
macos - 什么会导致 dlopen:找不到合适的图像(无法映射)?
使用 dlopen 加载附加包时可能导致以下错误的原因:
在此错误之前,该进程分配了大量内存。
($(OBJ_DIR)
用错误代替实际路径以使其更清晰)。
dylib - 使用 dlopen 查找 dylib 版本
有没有办法使用它的路径找到 dylib 的版本?我正在寻找可以接受与 dlopen 相同参数的东西。我查看了 NSVersionOfRunTimeLibrary,但从我阅读文档看来,它获取的是当前 dylib 的版本,而不是路径中指定的版本。
谢谢
c++ - 与 dlopen/dlsym 一起使用时 dynamic_cast 失败
介绍
让我为这个冗长的问题提前道歉。它尽可能短,不幸的是,它不是很短。
设置
我定义了两个接口,A和B:
然后,我有一个共享库“testc”构造 C 类的对象,实现 A 和 B,然后传递指向它们的 A 接口的指针:
最后,我有第二个共享库“testd”,它以 aA*
作为输入,并尝试将其转换为 a B*
,使用dynamic_cast
最后,我有主应用程序,A*
在库之间传递 's:
问题
如果我构建我的主应用程序,链接到“testc”和“testd”库,一切都会按预期工作。但是,如果我将主应用程序修改为不链接到“testc”和“testd”,而是在运行时使用dlopen
/加载它们dlsym
,那么会dynamic_cast
失败。
我不明白为什么。有什么线索吗?
附加信息
- 使用 gcc 4.4.1、libc6 2.10.1 (Ubuntu 9.10) 测试
- 可用的示例代码
linux - How to find shared objects loaded during startup of an application?
I know that using dlopen with RLTD_NOLOAD one can find out whether a shared object is already loaded or not. This, however, doesn't seem to work if a so is linked to the executable and loaded by the linker during application startup.
I mean, lets say I have mylib.so and load it with dlopen. Later, if I make dlopen with RLTD_NOLOAD, I get the handle as expected.
However, if I link mylib.so to the application ( -lmylib at the makefile ) dlopen returns NULL.
How can I get a handle to the shared object if it is directly linked to the exec. and not loaded explicitly?
Thanks in Advance
c - dlopen / dlsym 尽可能少的链接
我有一个应用程序可以使用在运行时使用 dlopen 加载的插件。每个插件都定义了一个函数来检索使用通用结构定义的插件信息。像这样的东西:
这很好用,可以加载插件。现在我想构建一个小工具来读取这些属性而不链接整个应用程序。为此,我有一些这样的代码:
这适用于简单的插件。问题是许多插件引用了应用程序中的更多符号,即使设置了 RTLD_LAZY,这些符号也得到了解决。(就像应用程序中用于初始化插件全局事物的全局变量)所以 dlopen() 调用失败并出现类似fatal: relocation error: file sample_plugin.so: symbol application_some_symbol: referenced symbol not found
. 因为我只想访问单个简单结构,所以我想知道如何阻止链接器完成他的大部分工作。
c++ - 动态库和主程序中的静态类变量
我正在开发一个包含静态 stl 容器类的“A”类的项目。这个类包含在我的主程序和 .so 文件中。该类使用默认(隐式,未声明)构造函数/析构函数。主程序使用 dlopen() 加载 .so 文件,并在其析构函数中调用 dlclose()。当 glibc 调用静态类成员变量的析构函数时,程序在 main 退出后崩溃。问题似乎是,当调用 dlclose() 时,调用了静态变量的析构函数,然后当 main exits() glibc 也调用析构函数时,导致双重释放。
我有两个问题,即:
1)在这种特殊情况下,为什么没有静态变量的两个副本(是的,我知道这听起来有些荒谬,但是由于主程序和 .so 文件都有一个单独编译的“A” ,他们不应该每个人都有一个吗?)
2)有没有办法解决这个问题而无需重写类'A'以不包含静态成员变量?