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
随便找他们需要的东西吗?
答案 0 :(得分:2)
LD_PRELOAD
不能使用,因为glibc动态链接器(有时称为ld.so
或程序解释器;磁盘上的位置是平台特定的)仅与libc.so.6
兼容(并且其余的库)来自同一glibc构建。
您可以使用另一个glibc的显式加载器调用,以及导致加载器从单独目录而非系统目录加载glibc对象的库路径设置。 glibc wiki举例说明了如何做到这一点。