【发布时间】:2016-04-25 02:20:06
【问题描述】:
我有一个 C++14 代码,它应该使用dlopen 加载任意共享对象文件。不幸的是,在某些系统上(例如我的 archlinux,据报道也适用于 ubuntu 和 gentoo 上的某些 .so),这些 so 文件可以是“GNU ld 脚本”而不是实际的二进制文件。
供参考,这里是我/usr/lib/libm.so的内容:
/* GNU ld script
*/
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /usr/lib/libm.so.6 AS_NEEDED ( /usr/lib/libmvec.so.1 ) )
我在ghc 或ruby 中找到了一些处理此问题的代码。我想避免诉诸基于解析 dlerror 文本和文件的手动解析文本文件。我觉得这是非常邪恶的,我将无法实现和维护这种格式的极端情况。
有没有一种干净的方法来处理这种情况?坦率地说,我很困惑为什么 dlopen 并没有真正透明地处理这些。
注意:考虑到上述补丁,我认为这不仅仅是我的系统配置/版本的问题。如果这应该与dlopen 一起使用(错误而不是缺少的功能),请告诉我。
【问题讨论】:
-
你的 ld.so 是否足够新?
-
与特定语言无关,但与加载/链接有关。
-
@Olaf 我正在寻找可以在我的 C++ 程序中使用的解决方案。由于我在运行时使用 C++/C 代码加载库,因此我认为这是相关的。
-
@Zulan,我知道您需要使用
dlopen(),这是一个c 函数,但请不要将C++/C 写成一种具有不同功能的单一语言。 -
@marcolz:我有一个
/usr/lib/ld-2.22.so作为archlinux 的一部分glibc 2.22-3