安装了gcc 5.1.0后“GLIBC”无法使用

安装了gcc 5.1.0后“GLIBC”无法使用

当我安装了 gcc 5.1.0 后,我发现很多程序无法使用,例如 firefox、gnome:它们会给我一条消息“GLIBC_2.1X not found”。现在GLIBC的版本比以前高了,所以这些程序都不能使用了。我认为这是因为gcc 5.1.0的安装使得GLIBC的版本更高。

我该怎么做才能拯救我的Linux并制作gcc,以便我的旧软件可以正常使用?

答案1

问题

您在很大程度上遇到了循环依赖问题。我这是从我的另一个答案复制的,因为仅仅链接它并不能做到这一点。无论您安装的是 GCC 5.1.0 的二进制版本,还是从源代码编译它,都会出现此问题。发生下面的讨论是因为系统上的每个包(无论是否为二进制)都隐式依赖于 GLIBC,因为 GLIBC 包含系统上每个包所需的符号和国际化代码。主要的例子有:

  1. 语言编码
  2. 货币符号
  3. 日期格式
  4. 计数格式
  5. 小数分隔符位置
  6. 分隔符类型、逗号小数等。

升级 GCC 会升级 GLIBC,而升级 GLIBC 则打破了上述列表以及更多内容。解决此问题的唯一方法是在升级 GCC 和 GLIBC 后重新编译或重新安装系统上的每个软件包,从工具链 - Ubuntu 特定 - 二进制分发类型,和一个工具链的一般描述


将基于源代码的软件包与基于二进制软件包的系统混合几乎是不可能的,因为您很容易造成版本不匹配。考虑以下:

  1. 二进制包版本 A 依赖于依赖项版本 B,并且只能与依赖项版本 B 一起使用。依赖项版本 B 使用库 C。
  2. 连接1(二进制包版本A)中的逻辑也隐式依赖于库C。
  3. 您使用库版本 D 构建了依赖项版本 B(如果 C = 1.0,D = 1.1)
  4. 依赖项版本 B 已成功构建,但二进制包版本 A 仍链接到库版本 C,因此二进制包 A 现在加载未解析的符号,因为库版本 C 中的符号已替换为版本 D 中较新的符号。
  5. 库版本 D 取代了库版本 C,因此开发人员决定不将其新版本 D 链接到版本 C。
  6. 要解决此问题,系统上链接到库版本 C 的每个包都必须使用库版本 D 重新编译。

你被困在这里是因为二进制系统上的所有包都是预先打包的,当从源代码编译时,其中一些或全部将被破坏

解决方案

尝试使用包管理器工具降级 gcc-5.1.0 和 GLIBC。如果您的包管理器不起作用,重新安装您的发行版会比向后安装更容易。

答案2

gcc无需升级即可编译GLIBC。我这样做了很多次,通常您只需要足够新的binutilsgmp和版本。事实上,这些彼此没有任何关系。我的意思是,如果您更改.mpfrmpcGLIBCgcc

但是,如果您确实安装了gcc自己编译的版本,永远不要在系统范围内这样做:这可能和直接改变GLIBC.相反,您可以gcc在家里保留一个工作版本,并提供运行时信息以链接到正确的库(通过调整LD_LIBRARY_PATH)。

现在,GLIBC是向后兼容,而不是向前兼容(至少在某种程度上)。如果GLIBC您自己没有进行任何更新,则仅意味着问题在于gcc您安装的版本是使用较新的GLIBC.在我的系统上,firefox例如链接到:

linux-vdso.so.1 (0x00007fff92d8a000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007ff8a7711000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007ff8a750d000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007ff8a718b000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007ff8a6e87000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007ff8a6ae5000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff8a792e000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007ff8a68cf000)

其中大部分是由 提供的gcc(因此其中GLIBC的错误firefox实际上是由 引发的gcc)。

第二种可能性是您已更新GLIBC(取决于您的安装方式,这可以像您使用的存储库中gcc存在更新版本一样简单)。GLIBC在这种情况下,这应该不是问题:使用以前版本编译的程序GLIBC应该可以与较新的版本一起使用(在有限的范围内)。但是,某些程序GLIBC出于各种原因保留引用非常特定的版本。所以也可能是这样。


为了恢复这个混乱......

如果您使用外部存储库并且仍然可以安装软件包,只需删除存储库并降级即可。

如果您gcc手动安装,您可以随时尝试重新安装它的存储库版本。但不要抱太大希望:您可能需要重新安装您的发行版。

相关内容