【问题标题】:Can LD_PRELOAD be used to load different versions of glibc?LD_PRELOAD可以用来加载不同版本的glibc吗?
【发布时间】:2019-08-06 18:42:15
【问题描述】:

角色阵容

  • big-old-app 链接到旧版本的 glibc,例如 glibc-2.12。我无法改变这一点。
  • cute-new-addon.o 链接到较新的版本 glibc-2.23。此glibc-2.23 位于非标准路径中(因为我没有 sudo 权限)。

故事

我想在big-old-app 中使用cute-new-addon.o。我通常会为big-old-app 编写一个脚本来执行,然后调用cute-new-addon.o 来执行它的技巧。从命令行看,它看起来像:

$ big-old-app script.txt

但是,当我这样做时,big-old-app 会抱怨 cute-new-addon.o 找不到 glibc-2.23。这是可以理解的,因为我没有指定任何标准路径。如果我这样做了:

$ LD_LIBRARY_PATH=/path/to/mylibs:$LD_LIBRARY_PATH big-old-app script.txt

它有段错误! :(

我认为这是因为big-old-app 引用了更​​新的mylibc.so.6。这样做时,实现不再是 big-old-app 习惯的那样,因此会出现段错误。

问题

关于script.txt,我认为我无法在调用cute-new-addon.o 之前指定较新的mylibc.so.6big-old-appcute-new-addon.o 紧密交织在一起,我无法知道它们中的任何一个何时需要对应的 glibc

是的,cute-new-addon.o rpath 指向 /path/to/mylibs,我可以通过 ldd 确认它需要的所有库,它在 /path/to/mylibs 中查找。

我可以使用LD_PRELOAD 加载glibc 的两个不同版本吗?让big-old-appcute-new-addon.o随心所欲地寻找他们需要的东西?

【问题讨论】:

标签: c ld glibc ld-preload


【解决方案1】:

LD_PRELOAD 不能使用,因为 glibc 动态链接器(有时称为 ld.so 或程序解释器;磁盘上的位置是特定于平台的)仅与来自的 libc.so.6(和其余库)兼容相同的 glibc 构建。

您可以使用其他 glibc 的显式加载程序调用,以及导致加载程序从单独目录而不是系统目录加载 glibc 对象的库路径设置。 glibc wiki 有一个示例如何做到这一点。

【讨论】:

  • 在不安装的情况下构建 glibc:“...前缀 /usr 被认为是系统 glibc 的正确前缀。”我觉得这是“从单独的目录加载 glibc 对象”所必需的。我在正确的轨道上吗?
  • 不,您可以使用--prefix=/usr 构建,但仍将副本保存在单独的位置,也许可以使用make install DESTDIR=/path/to/alternative/tree 安装它。
猜你喜欢
  • 1970-01-01
  • 2012-06-01
  • 2013-04-03
  • 2018-08-20
  • 2011-05-22
  • 2020-05-26
  • 2011-04-05
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多