【问题标题】:jdk1.8 GLIBC dependency issuejdk1.8 GLIBC 依赖问题
【发布时间】:2015-10-23 16:55:22
【问题描述】:

我将 rhel3 与 glibc-2.3.2 一起使用。我正在尝试从 JDK5 迁移到 jdk8,但遇到如下 GLIBC 依赖问题。基本上 JDK1.7 以后,与 GLIBC_2.4 存在这种依赖关系。

java -version
Error: dl failure on line 883
Error: failed /homes/jdk1.8.0_45/jre/lib/i386/server/libjvm.so, because /lib/tls/libc.so.6: version `GLIBC_2.4' not found (required by /homes/JDK1.8/jdk1.8.0_45/jre/lib/i386/server/libjvm.so)

我无法在当前系统中安装最新的 GLIBC,因为其他一些软件编译需要现有的 glibc 版本。我该如何进行?

【问题讨论】:

  • 呃哦,除了更新整个 linux 发行版之外,还有一些方法可以使用不同的库创建一个隔离的环境,但这更像是一个 linux 管理问题,完全独立于所讨论的软件是JVM,所以我建议重定向到SU...
  • @the8472 你能举个例子说明如何在我的上下文中使用 LD_PRELOAD。
  • LD_PRELOAD 保证不起作用。

标签: java linux java-8 glibc


【解决方案1】:

我无法在当前系统中安装最新的 GLIBC,因为其他一些软件编译需要现有的 glibc 版本。

你确定吗?除了极少数例外(__ctype_b 是我知道的唯一一个),较新版本的 GLIBC 向后兼容(旧应用程序继续与较新的 GLIBC 版本一起运行)。

我该如何继续?

如果您真的无法更新系统 glibc,您可以在非默认位置安装更新的 glibc,并让 JDK 使用它。

answer 中记录了有关如何执行此操作的一些详细信息。

另一种方法是使用“显式加载程序调用”,如下所示:

GLIBC221LIB=/path/to/glibc-2.21/lib
$GLIBC221LIB/ld-linux.so.2 --library-path $GLIBC221LIB \
  /path/to/jdk8/bin/java ...args...

另一种选择是升级系统 glibc,但将旧 glibc-2.3.2 保留在非默认位置,并将与新 glibc 版本不兼容的(希望少数)应用程序指向旧版本。

【讨论】:

  • 出于多种原因,我绝对无法更新 glibc。因此,让我们保留该选项。我试过GLIBC221LIB=/path/to/glibc-2.21/lib $GLIBC221LIB/ld-linux.so.2 --library-path $GLIBC221LIB \ /path/to/jdk8/bin/java ...args...:但得到错误FATAL: kernel too old
  • @Dil 不同版本的 GLIBC 有不同的最低内核要求。显然您为正在运行的内核选择了太新的版本。