Contents

解决“坏ELF解释器”错误

1. 概述

有时,当我们想要安装或运行从 Internet 下载或自己构建的应用程序时,我们可能会收到“错误的 ELF 解释器:没有这样的文件或目录”的错误消息。在本教程中,我们将跟踪并尝试解决可能导致错误的原因。

我们在 64 位机器上运行的 64 位 Debian 10.10 (Buster) 和 64 位 CentOS 8.3.2011 上测试了代码。

2. 问题介绍

**当我们尝试在 64 位操作系统上运行 32 位应用程序时,**通常会出现该问题:

$ ./binaryfile
bash: ./binaryfile: No such file or directory

其他一些 Linux 发行版(例如 CentOS)可能会给出更有意义的错误消息:

$ ./binaryfile
ERROR: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

或者我们可能会看到:

$ ./binaryfile
ERROR: /lib64/ld-lsb-x86-64.so.3: bad ELF interpreter: No such file or directory

我们可以使用readelf 检查应用程序是否是 32 位应用程序:

$ readelf -a binaryfile | grep ELF
ELF Header:
    Class:                           ELF32

如果应用程序是 32 位应用程序,则ELF标头中的Class属性应为ELF32 ,对于 64 位应用程序应为ELF64

“bad ELF interpreter”错误的原因通常是因为操作系统没有运行32位应用程序的支持库,所以我们需要安装它们。

3. 为 32 位应用程序安装支持库

对于它说“错误:/lib/ld-linux.so.2:坏 ELF 解释器:没有这样的文件或目录”的情况,** ld-linux.so是一个 ELF 动态链接器或加载器,它是操作系统的一部分加载和链接应用程序所需的共享库**。

由于操作系统找不到加载程序,我们将安装包含它的包,但首先,我们需要找到包名。

3.1. 查找包名称

如果我们使用的是 CentOS,我们可以运行:

$ sudo yum provides ld-linux.so.2
Last metadata expiration check: 0:51:38 ago on Sun 29 Aug 2021 10:14:19 PM UTC.
glibc-2.28-151.el8.i686 : The GNU libc libraries
Repo : @System
Matched from:
Provide : ld-linux.so.2
glibc-2.28-151.el8.i686 : The GNU libc libraries
Repo : baseos
Matched from:
Provide : ld-linux.so.2

**包名是glibc-2.28-151.el8.i686。**或者,如果我们使用的是 Debian,我们首先需要安装一个名为apt-file 的小实用程序,然后下载它的数据库:

$ sudo apt-get install apt-file && apt-file update
$ sudo apt-file find ld-linux.so.2
libc6-i386: /lib/ld-linux.so.2
libc6-i386: /lib32/ld-linux.so.2
...

包名是libc-i386

3.2. 安装软件包

我们可以在 CentOS 中使用dnf install安装包:

$ sudo dnf install glibc.i686

在 Debian 中,我们可以使用apt-get install

$ sudo apt-get install libc6-i386

安装包后,我们可以尝试重新运行应用程序:

$ ./binaryfile
./binaryfile: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

该错误现在说它找不到共享库libstdc++.so.6

我们将在下一节中跟踪并安装依赖库。

4. 解决依赖问题

我们可以构建或下载丢失的库,并将其放在应用程序可以找到它的目录中 - 例如,在应用程序所在的同一目录中或PATH 变量中的目录之一中。之后,我们可以尝试重新运行应用程序:

$ ./binaryfile
./binaryfile: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory

该错误表明它找不到另一个共享库。

我们可以不断重复这个过程,直到找到所有库,但是让我们使用readelf 工具列出应用程序需要的所有库

$ readelf -a binaryfile | grep NEEDED
0x00000001 (NEEDED) Shared library: [libpthread.so.0]
0x00000001 (NEEDED) Shared library: [libstdc++.so.6]
...
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.6]

我们可以找到并安装所有包含应用程序所需库的包,就像我们在上一节中对第一个包所做的那样。