使用dlopen加载GNU ld脚本

时间:2016-01-19 14:42:52

标签: c++ gnu ld

我有一个C ++ 14代码,应该使用dlopen加载任意共享对象文件。不幸的是在一些系统上(例如我的archlinux,据说也适用于ubuntu和gentoo上的一些.so),这些so-files可以是" 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开箱即用(错误而不是遗漏功能),请告诉我。

1 个答案:

答案 0 :(得分: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

<gnu/lib-names.h>应包含一个定义LIBM_SO,它应该指向您可以实际执行的正确文件()。

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