使用dlopen加载GNU ld脚本

6
我有一个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 ) )

我找到了几个处理ghcruby中此问题的代码片段。我想避免手动解析基于dlerror文本和文件的文本文件。我认为这是非常恶劣的,而且我无法实现和维护这种格式的边角情况。
有没有一种干净的方法来处理这种情况?坦白地说,我对dlopen为什么不能透明地处理这些情况感到困惑。
注意:考虑到上述补丁,我认为这不仅仅是我的系统配置/版本的问题。如果这应该在dlopen中开箱即用(错误而不是缺少功能),请让我知道。

你的 ld.so 版本是否足够新? - marcolz
与特定编程语言无关,但涉及加载/链接的内容。 - too honest for this site
@Olaf 我正在寻找一个可以在我的C++程序中使用的解决方案。由于我正在使用C++/C代码在运行时加载库,因此我认为这是相关的。 - Zulan
@Zulan,我知道你需要使用dlopen()这个[tag:c]函数,但请不要将C++/C写成一个具有不同特性的单一语言。 - Iharob Al Asimi
@marcolz:我在Archlinux的glibc 2.22-3中有一个/usr/lib/ld-2.22.so - Zulan
显示剩余2条评论
1个回答

5
链接器脚本旨在供链接器使用,而不是运行时链接器。
“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 应该包含一个定义LIBM_SO,它应该指向您实际可以dlopen()的正确文件。
这意味着通常不需要任何邪恶的代码。

虽然这不是我所期望/寻找的,但这个编辑真的很有帮助。虽然它没有透明地处理问题,并将解决方案移动到调用者代码中,但它很干净并且使我免于恐惧。 - Zulan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接