问题标签 [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 回答
5256 浏览

shared-libraries - 主程序和共享库在 __static_initialization_and_destruction_0 中初始化相同的静态变量

有谁知道为什么在 dlopen() 中初始化的库会初始化主程序拥有的静态变量。主程序和共享库都有一个静态变量的副本,但是由于某种原因,共享库重新初始化了主程序的静态变量副本并对其进行了破坏,从而在主程序尝试破坏它时导致了段错误。

这是符号表中名称错误的情况吗?

0 投票
5 回答
8767 浏览

c - 返回共享库符号表

例如:

假设没有错误,初始化程序将指向共享库 libSDK.so 中的函数 SD_Init。

但是,这需要知道符号“SDL_Init”的存在。

是否可以查询库的所有符号?例如,在这种情况下,它将返回 SDL_Init、函数指针以及 libSDL.so 导出的任何其他符号。

0 投票
1 回答
1621 浏览

linux - 在 linux 上,什么会导致 dlopen 发出 SIGFPE?

我有一个来源可疑的库,它被标识file为 32 位可执行文件。但是,当我在 32 位 CentOS 4.4 机器上尝试dlopen它时,dlopen 以SIGFPE. 当然,如果二进制文件的格式有问题,那么dlopen应该处理错误吗?

所以问题是:什么样的问题会导致 dlopen 发出 SIGFPE?

0 投票
1 回答
1943 浏览

python - python c扩展,mac os上的dlopen问题

我采用了一个作为二进制库(.a)和头文件分发的库,针对它编写了一些 c++ 代码,并希望将结果包装在一个 python 模块中。

我在这里做过。

问题是在 Mac OSX 上导入此模块时(我尝试过 10.5 和 10.6),我收到以下错误:

这看起来像 Carbon 框架中定义的符号没有被正确解析,但我不知道该怎么做。我提供-framework Carbondistutil.core.Extension'sextra_link_args参数,所以我不确定我还应该做什么。

任何帮助将非常感激。

更新:

setup.py 生成的编译行如下所示:

链接器行如下所示:

otool报告:

更新 2:在 MacOS 10.5 上,将 dlopen 标志从默认的 修改RTLD_NOWRTLD_LAZY解决问题。但是,这不适用于 Mac OS 10.6。

在 10.6 上,以下序列允许库正常运行,尽管我不确定为什么:

  1. python setup.py build -v
  2. 再次手动运行链接器行(由 setup.py 打印到控制台)。
  3. python setup.py 安装

我仍在寻找有关如何使其正常工作的好答案。谢谢!

0 投票
1 回答
9587 浏览

android-ndk - 无法在运行时在 android 应用程序中加载库

我正在开发 android 应用程序,其中我将 JNI 用于本机 c 代码。我在 android 2.0 版本和 ndkr3 上构建了这个应用程序,它工作正常。

现在,当我更改 android sdk 1.5 版和 api 3 版时,我遇到了无法打开库 libtest_demo.so 的问题。

我将 libtest_demo.so 文件放在同一位置 /data/data/org.abc.test_demo/lib/libtest_demo.so 但仍然出现同样的问题。

在我的 java 文件中,我调用了本地库,例如,

从 logcat 我看到两个库都使用了相同的内存地址。

这是 logcat 输出

0 投票
2 回答
4129 浏览

linux - 使用 dlopen() 动态加载共享对象

我正在开发一个普通的 X11 应用程序。

默认情况下,我的应用只需要 libX11.so 和标准的 gcc C 和数学库。该应用程序可以通过 Xfixes、Xrender 和 ALSA 声音系统扩展功能。但是,这些(Xfixes、Xrender 和 ALSA)功能是可选的。

为了实现这种行为,我使用运行时加载,即,libXfixes、libXrender 和 libasound 应该是 dlopen()ed。

因此,该应用程序可以在没有此类库的情况下运行。

现在我的问题:

我观察到这些因发行版而异。
例如,在 openSUSE 11 上,它们被命名为:

  • libXfixes.so
  • libXrender.so
  • libasound.so

然而,在 Ubuntu 上,这些名称附有版本号,如下所示:

  • libXfixes.so.3
  • libXrender.so.1
  • libasound.so.2

因此,在 Ubuntu 上尝试打开“libXfixes.so”会失败,尽管 lib 显然在那里。它只是附加了一个版本号。那么我的应用程序应该如何处理呢?
我是否应该让我的应用程序首先手动扫描 /usr/lib/ 以查看我们拥有哪些库,然后选择合适的库?或者有人有更好的主意吗?

多谢你们,

安迪

0 投票
1 回答
2450 浏览

c++ - 未定义符号 GCC / C++ 动态加载 *.so 对象

-我正在尝试编译 netsnmp mib 并扩展 snmp 代理的功能。

  • 当我尝试启动守护程序并加载共享对象 (*.so) 时,守护程序会抱怨未定义的符号。“dlopen 失败:Filename.so:未定义符号:netsnmp_container_table_row_extract”

  • 在进一步刺激 #nm -D -u Filename.so 打印出许多未定义的引用/符号

  • 其中一些引用 system calls特定于 snmp 代理。

  • 我在编译代码时没有任何问题。所有缺少的引用/符号都是对 netsnmp 代理的调用。

问题: 1. 我如何在不解析这些符号的情况下进行编译?AFIK:这些符号必须已静态解析。2. 我假设系统无法在运行时解决这些问题?3.我怎样才能克服这个问题?有什么建议么

谢谢 SS

0 投票
3 回答
2184 浏览

c++ - C++ 沙盒动态库

我想知道是否可以通过 dlopen 和朋友对动态链接库进行沙箱化。目的是从库中的错误中恢复,而不会破坏整个应用程序,例如 SEGFAULT 等。

有人在这方面有经验吗?

0 投票
2 回答
3155 浏览

linux - dlopen 与两个共享库,导出符号

我有一个 linux 共享库 foo.so,它是使用dlopen("foo.so", RTLD_NOW | RTLD_LOCAL). 从 foo.so 我想 dlopen 另一个库 bar.so,它引用了 foo.so 中定义的符号,但链接器找不到它们。我无法将 RTLD_LOCAL 更改为 RTLD_GLOBAL,因为我没有执行加载的可执行文件的源代码。我认为-Wl,--export-dynamic在链接 foo.so 时可能会有所帮助,但它不会将本地标志覆盖为 dlopen。GCC 的新属性可见性功能看起来也没有提供答案。

有没有一种方法可以指示链接器将对 bar.so 中未定义符号的引用解析为 foo.so 中的那些定义,而无需使用 -lfoo 链接 bar 或相似性将符号移动到第三个库中并将 foo 和 bar 链接到它? 我唯一想到的是从 foo.so 本身使用 RTLD_GLOBAL dlopen foo.so,然后 dlopen bar.so,但这让我觉得有点乱。谢谢。

0 投票
2 回答
3844 浏览

c++ - 在 OSX 上通过 dlopen 打开库时调试崩溃

我开发的 C++ 应用程序使用 dlopen 加载用户开发的库时遇到问题。在过去的几年里,该应用程序已被各种 linux 发行版和 OSX 版本的各种人使用,所以我假设我对 dlopen 的使用没问题,依赖它的代码也是如此(是的,这是狂妄自大,所以我会在失败时报告)。我现在遇到的问题是一个用户开发了一个库,它没有加载到我的系统(OSX 10.6.4)上。当系统尝试加载它时,会出现冻结然后崩溃。崩溃的线程在崩溃报告中如下所示:

(如果需要,我可以发布完整的日志,但如果我将它包含在我的帖子中,它会超出正文文本限制)

在我运行可执行文件的终端中,除了运行可执行文件的脚本已捕获信号的通知外,崩溃不会产生任何输出。

我的问题是如何获得有关可能导致此崩溃的原因的更多信息?如果有人可以提出可能的解决方案,我也很高兴,但首先我想知道当系统崩溃时如何生成更多关于实际错误的信息。

如果我在最初由 dlopen 打开的库上运行 otool,一切看起来都很好(没有丢失的链接、符号等)。我的主要怀疑是,正在加载的库所链接的库的特定组合以某种方式导致了这种崩溃。可以加载这些其他库,它们使用这些链接库的不同子集。记录在案的库包括 X11、ZeroC 的 Ice、Player/Stage 和 OpenCV(后 2 个使用 MacPorts 安装的依赖项手动编译)。似乎是包含 OpenCV 导致了问题,因为链接到除 OpenCV 之外的所有这些的其他库可以毫无问题地加载。这些是我的怀疑,但我目前缺乏进一步调查的专业知识。

谢谢!缺口

更新:感谢 Kaelin 的回答(我以前不知道的 DYLD_PRINT_* 选项),我至少能够确认没有完全明显的事情发生。使用调试信息,我能够将问题缩小到导致崩溃的一个特定库。事实证明,这个库(libdc1394 通过 OpenCV 中的 libhighgui 链接到我的应用程序)没有正确链接到 CoreServices,这导致了崩溃。由于某种原因,错误随后被其他事物隐藏,导致最终崩溃。有关 libdc1394 问题的信息,请查看此处。不幸的是,我无法在此处报告一个干净的修复程序,因此只能设法获得一个未链接到狡猾库的应用程序版本(通过在 OpenCV 编译中关闭 libdc1394)。