我有一个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 ) )
我在ghc或ruby找到了几个处理此问题的代码。我想避免根据解析dlerror
文本和文件来手动解析文本文件。我觉得这非常邪恶,我无法实现和维护这种格式的角落案例。
有没有一种干净的方法来处理这种情况?坦率地说,我很困惑为什么dlopen
实际上并没有真正处理这些问题。
注意:考虑到上述补丁,我认为这不仅仅是我的系统配置/版本的问题。如果这应该与dlopen
开箱即用(错误而不是遗漏功能),请告诉我。
答案 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,它应该指向您可以实际执行的正确文件()。
这意味着通常不需要恶意代码。