CentOS 64位不良ELF解释器

186

我刚刚安装了CentOS 6的64位版本,现在想在这个64位机器上安装32位应用程序,但是出现了如下错误:

/lib/ld-linux.so.2: 坏的ELF解释器:没有那个文件或目录

我该如何解决这个问题?

9个回答

362

您所使用的是64位系统,但未安装32位库支持。

安装(基线)32位可执行文件支持

(如果您的设置中不使用sudo,请阅读下面的注意事项)

大多数Fedora/Red Hat系列的桌面Linux系统:

 pkcon install glibc.i686

可能是一些桌面版的Debian/Ubuntu系统吗?

pkcon install ia32-libs

适用于 Fedora 或更新版本的 Red Hat、CentOS:

 sudo dnf install glibc.i686

旧版RHEL,CentOS:

   sudo yum install glibc.i686

即使是更老的RHEL和CentOS:

  sudo yum install glibc.i386

Debian或Ubuntu:

   sudo apt-get install ia32-libs

这将帮助您获取所需的(第一个、主要的)库。

一旦获得了该库,您可能需要支持库

需要安装glibc.i686glibc.i386的任何人可能也会遇到其他库依赖性。为了确定提供任意库的软件包,您可以使用

 ldd /usr/bin/YOURAPPHERE

如果您不确定它是否在 /usr/bin 中,您还可以退而求其次。

 ldd $(which YOURAPPNAME)

输出结果将会是这样的:

    linux-gate.so.1 =>  (0xf7760000)
    libpthread.so.0 => /lib/libpthread.so.0 (0xf773e000)
    libSM.so.6 => not found

检查是否缺少库(例如上述输出中的libSM.so.6),对于每个缺失的库,需要找到提供它的软件包。

各发行版家族查找软件包的命令

Fedora/Red Hat Enterprise/CentOS:

 dnf provides /usr/lib/libSM.so.6

或者,在旧版的RHEL/CentOS上:

 yum provides /usr/lib/libSM.so.6

或者,在Debian/Ubuntu上:

首先,安装并下载 apt-file 数据库。

 sudo apt-get install apt-file && apt-file update

然后使用搜索功能

 apt-file find libSM.so.6
请注意通常情况下的前缀路径为/usr/lib,但有些库基于历史原因仍存放在/lib下……在典型的64位系统中,32位库位于/usr/lib,而64位库位于/usr/lib64
(Debian / Ubuntu以不同方式组织多架构库。)

安装缺失库的软件包

上述内容应该给出一个软件包名称,例如:
libSM-1.2.0-2.fc15.i686 : X.Org X11 SM runtime library
Repo        : fedora
Matched from:
Filename    : /usr/lib/libSM.so.6
在这个例子中,软件包的名称是libSM,而软件包的32位版本的名称是libSM.i686
然后,您可以使用pkcon在GUI中安装软件包以获取所需的库,或者根据情况使用sudo dnf/yum/apt-get。例如:pkcon install libSM.i686。如有必要,您可以完全指定版本。例如:sudo dnf install ibSM-1.2.0-2.fc15.i686
一些库将在其名称之前具有“纪元”描述符;可以省略此描述符(好奇的人可以阅读下面的注释)。
注意:
警告:
偶然的情况是,您面临的问题可能意味着您的RPM(resp. DPkg/DSelect)数据库已损坏,或者您尝试运行的应用程序未通过软件包管理器安装。如果您是Linux新手,则可能希望尽可能避免使用除软件包管理器之外的其他来源的软件。
如果您的设置中没有使用“sudo”,则键入
su -c
每当您看到sudo时,例如:
su -c dnf install glibc.i686

关于库名称中的Epoch标识符

在名称前面加上“epoch”标识符是由于基础RPM库处理版本号的方式造成的遗留问题,例如:

2:libpng-1.2.46-1.fc16.i686 : A library of functions for manipulating PNG image format files
Repo        : fedora
Matched from:
Filename    : /usr/lib/libpng.so.3
在这里,2:可以省略; 只需使用pkcon install libpng.i686sudo dnf install libpng-1.2.46-1.fc16.i686。(它模糊地暗示了这样的事情:在某个时刻,libpng包的版本号回滚了,并且“epoch”必须被增加以确保新版本会在更新期间被视为“较新”。或者发生了类似的事情。两次。)更新以更充分地澄清和涵盖各种软件包管理器选项(2016年3月)。

我已经安装了,现在出现了libpam.so.0:无法打开共享对象文件的错误。 - c11ada
7
如果你的应用程序没有列出其所需的库,那么你需要自己寻找并安装它们;幸运的是,如果这些库可以通过yum获取,你就能轻松解决。你可以使用"ldd(二进制文件)"命令来列出库。对于每个被列出但没有像"/lib/ld-linux.so.2 (0x4f8d9000)" 或 "libc.so.6 => /lib/libc.so.6 (0x4f8fa000)"一样的输出的库,尝试输入以下命令来查找包名:sudo yum provides */lib/libWHATEVER.so,然后再输入sudo yum install PACKAGE.i686来安装它(确保选择i386或i686版本,而不是默认安装在系统上的x86_64版本)。 - BRPocock
当你必须将32位软件迁移到64位系统时,这个答案就是救星。 - froggythefrog
这对于在Fedora 20上安装Oracle的jre 1.7非常有帮助。除了glibc.i686之外,我还需要安装libgcc.i686。 - John Schmitt

18

我在一台新安装的CentOS 6.4 64位机器上遇到了同样的问题。一个简单的yum命令可以解决这个问题,也可以解决99%的类似问题:

yum groupinstall "Compatibility libraries"

您可以在命令前加上“sudo”或以root身份运行,以适应您的需要。


16

通常情况下,当你遇到这样的错误时,只需执行以下操作:

yum provides ld-linux.so.2

然后你会看到类似于:

glibc-2.20-5.fc21.i686 : The GNU libc libraries
Repo        : fedora
Matched from:
Provides    : ld-linux.so.2

然后你只需要像BRPocock写的那样运行以下代码(如果你想知道这个逻辑是什么...):

yum install glibc.i686

4

尝试

$ yum provides ld-linux.so.2
$ yum update
$ yum install glibc.i686 libfreetype.so.6 libfontconfig.so.1 libstdc++.so.6

希望这能解决疑惑。

2
您还可以安装32位的OpenJDK(.i686)。根据我的测试,它可以被安装并正常工作。
sudo yum install java-1.8.0-openjdk.i686

注意:

java-1.8.0-openjdk软件包仅包含Java运行时环境。如果您想开发Java程序,请安装java-1.8.0-openjdk-devel软件包。

有关更多详细信息,请参见此处

0

我只是想在BRPocock中添加一条评论,但我没有足够的权限。

所以我的贡献是为了每个试图从IBM的Integration Bus捆绑包安装IBM Integration Toolkit的人。

当您尝试从文件夹/Integration_Toolkit/IM_Linux运行“Installation Manager”命令(要运行的文件是“install”)时,您会收到本帖子中显示的错误。

进一步解决此问题的说明可以在IBM的网页上找到: https://www-304.ibm.com/support/docview.wss?uid=swg21459143

希望这对任何试图安装该工具包的人有所帮助。


0

sudo yum安装fontconfig freetype libfreetype.so.6 libfontconfig.so.1 libstdc++.so.6


0
在我的情况下,我使用命令 yum install redhat-lsb 解决了这个问题。

0

我想要补充一下,对于Debian系统来说,至少需要有一个编译器(根据Debian Stretch and Jessie 32-bit libraries)。

我安装了apt-get install -y gcc-multilib,以便在基于debian:jessie的docker容器中运行32位可执行文件。


请在您的答案中包含链接的必要部分。抱歉,我无法回答此问题,因为没有提供要翻译的具体内容或链接。请提供更多信息以便我能够帮助您。 - Ibo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接