c++ - 使用 dlopen 加载 GNU ld 脚本

标签 c++ gnu ld

我有一个 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 ) )

我在 ghc 中找到了几个处理这个问题的代码片段或 ruby .我想避免诉诸基于解析 dlerror 文本和文件的手动解析文本文件。我觉得那是非常邪恶的,我将无法实现和维护这种格式的极端情况。

有没有一种干净的方法来实现处理这种情况?坦率地说,我很困惑为什么 dlopen 实际上没有直接处理这些。

注意:考虑到上述补丁,我认为这不仅仅是我的系统配置/版本的问题。如果这应该与 dlopen 开箱即用(错误而不是缺少功能),请告诉我。

最佳答案

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

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() 的正确文件。

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

关于c++ - 使用 dlopen 加载 GNU ld 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34879686/

相关文章:

c++ - 将 C++ 类及其派生类放在特定部分

c++ - 特定情况下的类析构函数

c - 权限位解释

linux - 使用 Gnuplot 损坏的 Eps 图像/绘图

c - 与另一个启动文件链接

c - 在 GCC 中使用 -Wall -Wextra 并出现错误

double 总和的 C++ 结果是错误的

c++ - 波普勒替代品

c++ - 从 .begin() 和 .end() 迭代器获取数组

c++ - GNU argp "too few arguments"