【问题标题】:Loading GNU ld script with dlopen使用 dlopen 加载 GNU ld 脚本
【发布时间】:2016-04-25 02:20:06
【问题描述】:

我有一个 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 是否足够新?
  • 与特定语言无关,但与加载/链接有关。
  • @Olaf 我正在寻找可以在我的 C++ 程序中使用的解决方案。由于我在运行时使用 C++/C 代码加载库,因此我认为这是相关的。
  • @Zulan,我知道您需要使用dlopen(),这是一个c 函数,但请不要将C++/C 写成一种具有不同功能的单一语言。
  • @marcolz:我有一个/usr/lib/ld-2.22.so 作为archlinux 的一部分glibc 2.22-3

标签: c++ gnu ld


【解决方案1】:

链接器脚本旨在供链接器使用,而不是运行时链接器。

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,它应该将您指向正确的文件,您实际上可以 dlopen()。

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

【讨论】:

  • 虽然这不是我希望/寻找的,但编辑确实很有帮助。虽然它没有透明地处理问题,并将解决方案移至调用者代码,但它很干净,让我免于恐惧。
猜你喜欢
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 2011-10-16
  • 1970-01-01
  • 2012-01-08
  • 2020-11-28
  • 1970-01-01
相关资源
最近更新 更多