LD_PRELOAD可以用来加载不同版本的glibc吗?

标签 c ld glibc ld-preload

角色阵容

  • 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 之前指定较新的 mylibc.so.6 .obig-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 随心所欲地寻找他们需要的东西?

最佳答案

LD_PRELOAD 无法使用,因为 glibc 动态链接器(有时称为 ld.so 或程序解释器;磁盘上的位置是特定于平台的)仅与libc.so.6(以及其他库)来自同一个 glibc 构建。

您可以使用其他 glibc 的显式加载程序调用,以及导致加载程序从单独目录而非系统目录加载 glibc 对象的库路径设置。 glibc wiki有一个如何执行此操作的示例。

关于LD_PRELOAD可以用来加载不同版本的glibc吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55186770/

相关文章:

c - 我使用 C 编程在我的帕斯卡三角形中有一些间距错误

c - 使用函数和双指针编写一个程序来查找给定矩阵是否为空?

c - 删除 libxml2 c 中 xmldocument 和根节点之间的空白

c - 链接目标文件和链接包含这些文件的静态库

c - 为什么 gcc 中 '-l' 选项的顺序很重要?

linux - gnu ld 链接器行为的变化

ubuntu - Visual Studio Code 1.51.1 未在 Ubuntu 20.10 上启动(未找到错误 : GLIBC_2. 29')

c - Linux 内核和 GNU C 库之间的关系是什么?

c - Sqlite 外键

python - 在 GLIBC 版本较低的目标系统上,从 .so 文件导入 Python 模块失败