big-old-app
与旧版glibc
相关联,glibc-2.12
说。我无法改变这一点。cute-new-addon.o
与更新版本glibc-2.23
相关联。这个glibc-2.23
是一个非标准的道路(因为我没有sudo权力)。我想在cute-new-addon.o
中使用big-old-app
。我通常会为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
,我认为我无法在调用mylibc.so.6
之前指定更新的cute-new-addon.o
。 big-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
或程序解释器;磁盘上的位置是特定于平台的)仅与来自相同glibc构建的libc.so.6
(以及其余库)兼容。
您可以使用其他glibc的显式加载器调用以及库路径设置,这些设置会导致加载程序从单独的目录加载glibc对象,而不是系统目录。 glibc wiki有一个例子如何做到这一点。