我有一个 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
开箱即用(错误而不是缺少功能),请告诉我。
最佳答案
链接器脚本旨在供链接器使用,而不是运行时链接器。
GNU ld script
评论应该是赠品:这是给 ld
的, 不适用于 ld.so
. ;-)
例如:http://www.math.utah.edu/docs/info/ld_3.html
所以我想将它与 dlopen()
一起使用将意味着模仿/导入 ld
的一部分的魔力,这将证实您对诉诸手动解析文本和维护极其邪恶的代码的恐惧。
编辑:似乎有一件事可以帮助您:
https://www.sourceware.org/ml/libc-alpha/2011-07/msg00152.html
<gnu/lib-names.h>
应该包含一个定义 LIBM_SO,它应该指向您实际上可以 dlopen() 的正确文件。
这意味着通常不需要恶意代码。
关于c++ - 使用 dlopen 加载 GNU ld 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34879686/