角色阵容
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-app
和 cute-new-addon.o
紧密交织在一起,我无法知道它们何时需要相应的 glibc
.
是的,cute-new-addon.o
rpath
指向 /path/to/mylibs
我可以通过 ldd
它需要的所有库,它在 /path/to/mylibs
中查找。
我可以使用 LD_PRELOAD
加载两个不同版本的 glibc
吗?让 big-old-app
和 cute-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/