C++ 使用dlopen加载GNU ld脚本
我有一个C++14代码,它应该使用C++ 使用dlopen加载GNU ld脚本,c++,gnu,ld,C++,Gnu,Ld,我有一个C++14代码,它应该使用dlopen加载任意共享对象文件。不幸的是,在某些系统上(例如my archlinux,据说也适用于某些.so,如ubuntu和gentoo),这些so文件可能是“GNU ld脚本”,而不是实际的二进制文件 以下是我的/usr/lib/libm的内容供参考 /* GNU ld script */ OUTPUT_FORMAT(elf64-x86-64) GROUP ( /usr/lib/libm.so.6 AS_NEEDED ( /usr/lib/libmvec
dlopen
加载任意共享对象文件。不幸的是,在某些系统上(例如my archlinux,据说也适用于某些.so,如ubuntu和gentoo),这些so文件可能是“GNU ld脚本”,而不是实际的二进制文件
以下是我的/usr/lib/libm的内容供参考
/* GNU ld script
*/
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /usr/lib/libm.so.6 AS_NEEDED ( /usr/lib/libmvec.so.1 ) )
我在or中找到了几个处理此问题的代码段。我希望避免诉诸于基于解析dlerror
文本和文件的手动解析文本文件。我觉得这是非常邪恶的,我将无法实现和维护这种格式的角落案例
有没有一个干净的方法来处理这个案件?坦率地说,我很困惑为什么dlopen
实际上不能并行处理这些问题
注意:考虑到前面提到的补丁,我认为这不仅仅是我的系统配置/版本的问题。如果这在dlopen(错误而不是缺少功能)下可以正常工作,请告诉我。链接器脚本是供链接器使用的,而不是供运行时链接器使用的
gnuld脚本
注释应该是赠品:这是给ld
,而不是给ld.so
;-)
例如,见:
因此,我猜将此与dlopen()
一起使用意味着模仿/导入ld
的部分魔力,这将证实您对求助于手动解析文本和维护极其邪恶的代码的担忧
编辑:似乎有一件事可以帮助你:
应该包含一个define LIBM_,以便将它指向可以实际打开的正确文件()
这意味着通常没有邪恶的代码是必要的。
是你的LD,所以最近足够了。与特定语言无关,但关于加载/链接。@奥拉夫我正在寻找一个可以在我的C++程序中使用的解决方案。由于我在运行时使用C++或C代码加载库,所以我认为这是相关的。@ Zulan,我理解您需要使用<代码> dLOpen[](<代码)>这是一个函数,但是请不要把C++/C写成一种具有不同功能的单一语言。@marcolz:我有一个/usr/lib/ld-2.22。因此
作为archlinuxglibc 2.22-3
的一部分,虽然这不是我希望/寻找的,但编辑确实很有帮助。虽然它不能透明地处理问题,并将解决方案转移到调用方代码中,但它是干净的,可以让我免于恐惧。