使用 dlopen 加载 GNU ld 脚本

Loading GNU ld script with dlopen

我有一个 C++14 代码,它应该使用 dlopen 加载任意共享对象文件。不幸的是,在某些系统上(例如我的 archlinux,据说也适用于 ubuntu 和 gentoo 上的某些 .so),这些 so 文件可以是 "GNU ld scripts" 而不是实际的二进制文件。

供参考,这里是我/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 or ruby 中找到了几个处理这个问题的代码片段。我想避免诉诸基于解析 dlerror 文本和文件的手动解析文本文件。我觉得那是非常邪恶的,我将无法实现和维护这种格式的极端情况。

有没有一种干净的方法来实现处理这种情况?坦率地说,我很困惑为什么 dlopen 实际上没有处理这些问题。

注意:考虑到上述补丁,我认为这不仅仅是我的系统配置/版本的问题。如果这应该与 dlopen 开箱即用(错误而不是缺少功能),请告诉我。

链接器脚本旨在供链接器使用,而不是 run-time 链接器。

GNU ld script 评论应该是赠品:这是给 ld,而不是给 ld.so。 ;-)

例如见:http://www.math.utah.edu/docs/info/ld_3.html

所以我想将它与 dlopen() 一起使用意味着 mimicking/importing 部分 ld 的魔力,这将证实您对诉诸手动解析文本和维护的恐惧非常邪恶的代码。

编辑:似乎有一件事可以帮助你:

https://www.sourceware.org/ml/libc-alpha/2011-07/msg00152.html

<gnu/lib-names.h> 应该包含一个定义 LIBM_SO 它应该指向您实际上可以 dlopen().

的正确文件

这意味着通常不需要恶意代码。