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

时间:2019-03-15 16:18:47

标签: c ld glibc ld-preload

字符转换

  • big-old-app链接到旧版本的glibc,例如glibc-2.12。我无能为力。
  • cute-new-addon.o已链接到较新的版本glibc-2.23glibc-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.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随便找他们需要的东西吗?

1 个答案:

答案 0 :(得分:2)

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

您可以使用另一个glibc的显式加载器调用,以及导致加载器从单独目录而非系统目录加载glibc对象的库路径设置。 glibc wiki举例说明了如何做到这一点。