1

我需要在不太新的 RHEL 5.6 上运行相对较新的包。

我有lib3rdparty.so针对 glibc 2.6 编译的 3rd 方库 (),而 RHEL 5.6 仅安装了 2.5。但是在图书馆里只有几个引用sched_getcpu@@GLIBC_2.6。我已经像这样检查过

readelf -s lib3rdparty.so | egrep "@GLIBC_2.[6-9]"

GLIBC_2.5查找对比已安装的更新的东西的引用。输出是

0 FUNC    GLOBAL DEFAULT  UND sched_getcpu@GLIBC_2.6 (62)
0 FUNC    GLOBAL DEFAULT  UND sched_getcpu@@GLIBC_2.6

所以,我只有一个功能GLIBC_2.6。现在我想让图书馆认为我有这个功能。为此,我伪造了这里libcheat.so提到的小型库 () 。现在我有文件,如果运行,将显示此字符串:libcheat.soreadelf

10 FUNC    GLOBAL DEFAULT   11 sched_getcpu@@GLIBC_2.6

使用这个库,我成功地构建了与lib3rdparty.so. 如果没有这个库,我将无法构建任何东西,因为ld找不到对sched_getcpu.

但问题在于运行此文件:当我尝试运行它时,出现以下错误:

 ./hello_world: version `GLIBC_2.6' not found (required by ./lib3rdparty.so)

所以,我相信还有最后一步可以让它发挥作用,但我不知道该怎么做。我尝试使用/etc/ld.conf.preload和导出LD_LIBRARY_PATH,因此它会指向我的库,以便在其他人之前加载。但它不会运行。试图运行它,strace但没有有意义的输出。

有任何想法吗?

4

2 回答 2

0

我不确定您选择的解决方法是否是最好的方法。为什么不为应用程序提供更新的 glibc?您可以尝试使用LD_PRELOAD环境变量传递它。为了获得最佳的二进制兼容性,您可以从较新的分发版本中获取 glibc 二进制文件,或者为 RHEL 5.6 重新构建较新的 glibc 版本。

此外,尝试摆弄LD_DEBUG环境变量以查看动态链接器的作用。

于 2011-11-03T13:08:38.457 回答
0

好的,我相信我应该提到“最后一步”,在我的例子中包括修补二进制 3rd 方库。

  1. 使用objdump我找到了一个lib3rdparty.so搜索地址GLIBC_2.6
  2. 使用hexedit我将这个地址替换GLIBC_2.5为导出的地址(您应该以相反的顺序搜索字节)。我也用 2.5 替换了符号。
  3. 使用objdump我已经检查了所有引用现在使用GLIBC_2.5
  4. 我需要重建libcheat.so,因为sched_getcpu现在正在引用GLIBC_2.5,所以我用作sched_getcpu@@GLIBC_2.5汇编器内联

之后,我将libcheat.sonear lib3rdparty.so,设置LD_LIBRARY_PATH.并且我的二进制文件开始工作。我不确定这些东西是否会完全正确,但如果你偶然遇到这种问题,这个问题和答案可能会有所帮助。

于 2012-03-20T04:21:57.917 回答