问题标签 [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 投票
5 回答
3588 浏览

c++ - 使用 dlopen,我如何应对已加载的库文件的更改?

我有一个用 C++ 编写的程序,它使用 dlopen 加载动态库(Linux、i386、.so)。随后修改库文件时,我的程序往往会崩溃。这是可以理解的,因为大概文件只是映射到内存中。

我的问题是:除了简单地为自己创建文件的副本并将其删除之外,我是否有办法加载对后续修改安全的共享对象,或者从对我已加载的共享对象的修改中恢复的任何方法?

澄清:问题不是“我怎样才能安装一个新的库而不使程序崩溃”,而是“如果我无法控制的人正在复制库,我可以防御吗?”

0 投票
3 回答
5352 浏览

linux - linux dlopen:加载时可以“通知”库吗?

有没有办法让共享库在加载时得到“通知”?

换句话说,假设我在共享库上使用dlopen,是否有一个在共享库上自动调用(如果存在)的函数(例如 main?)

0 投票
2 回答
16422 浏览

linux - 动态加载时的库路径?

如何从库本身中获取共享库的路径?

换句话说,假设库 X 是使用 加载的dlopen(),我如何才能访问用于从库本身中加载所述库的路径?

请注意,我不能让首先加载库的代理将这个参数交给我。

更新:这是使用静态变量的方法:

0 投票
4 回答
281 浏览

linux - 禁用对“exec”功能的访问?

假设我有一个加载动态库“L”的进程“A”。

问:有没有办法禁止对“L”内部函数的“exec”函数的访问?

0 投票
3 回答
11853 浏览

macos - 什么会导致 dlopen:找不到合适的图像(无法映射)?

使用 dlopen 加载附加包时可能导致以下错误的原因:

在此错误之前,该进程分配了大量内存。

$(OBJ_DIR)用错误代替实际路径以使其更清晰)。

0 投票
2 回答
8880 浏览

dylib - 使用 dlopen 查找 dylib 版本

有没有办法使用它的路径找到 dylib 的版本?我正在寻找可以接受与 dlopen 相同参数的东西。我查看了 NSVersionOfRunTimeLibrary,但从我阅读文档看来,它获取的是当前 dylib 的版本,而不是路径中指定的版本。

谢谢

0 投票
4 回答
7546 浏览

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) 测试
  • 可用的示例代码
0 投票
1 回答
522 浏览

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

0 投票
3 回答
2984 浏览

c - dlopen / dlsym 尽可能少的链接

我有一个应用程序可以使用在运行时使用 dlopen 加载的插件。每个插件都定义了一个函数来检索使用通用结构定义的插件信息。像这样的东西:

这很好用,可以加载插件。现在我想构建一个小工具来读取这些属性而不链接整个应用程序。为此,我有一些这样的代码:

这适用于简单的插件。问题是许多插件引用了应用程序中的更多符号,即使设置了 RTLD_LAZY,这些符号也得到了解决。(就像应用程序中用于初始化插件全局事物的全局变量)所以 dlopen() 调用失败并出现类似fatal: relocation error: file sample_plugin.so: symbol application_some_symbol: referenced symbol not found. 因为我只想访问单个简单结构,所以我想知道如何阻止链接器完成他的大部分工作。

0 投票
2 回答
4573 浏览

c++ - 动态库和主程序中的静态类变量

我正在开发一个包含静态 stl 容器类的“A”类的项目。这个类包含在我的主程序和 .so 文件中。该类使用默认(隐式,未声明)构造函数/析构函数。主程序使用 dlopen() 加载 .so 文件,并在其析构函数中调用 dlclose()。当 glibc 调用静态类成员变量的析构函数时,程序在 main 退出后崩溃。问题似乎是,当调用 dlclose() 时,调用了静态变量的析构函数,然后当 main exits() glibc 也调用析构函数时,导致双重释放。

我有两个问题,即:
1)在这种特殊情况下,为什么没有静态变量的两个副本(是的,我知道这听起来有些荒谬,但是由于主程序和 .so 文件都有一个单独编译的“A” ,他们不应该每个人都有一个吗?)
2)有没有办法解决这个问题而无需重写类'A'以不包含静态成员变量?