使用 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().
的正确文件
这意味着通常不需要恶意代码。
我有一个 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().
这意味着通常不需要恶意代码。