如何在Ubuntu 64位系统中运行32位应用程序?

我安装了Ubuntu 14.04和当前的Android开发SDK,其中包含32位可执行文件。我发现我无法运行这些32位二进制文件。尝试从bash启动它们会给我一个错误提示:
$ ./adb
bash: ./adb: No such file or directory

它确实在那里。
$ ls -al ./adb
-rwxrwxrwx 1 thomas thomas 1231255 Jan 17 13:31 ./adb
$ file ./adb
./adb: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped. 

所有其他32位工具在Android SDK中都有相同的症状。
以前,人们可以在64位Ubuntu上安装32位库来获得32位支持,但现在似乎不再起作用。
我如何在64位Ubuntu发行版上运行32位应用程序?

https://stackoverflow.com/a/19524010/1778421 - Alex P.
相关链接:https://askubuntu.com/questions/1270351/how-to-compile-32-bit-executable-on-64-bit-system - 0 _
相关:https://unix.stackexchange.com/q/352783/43390 - 0 _
相关:https://askubuntu.com/a/905083/173666 - 0 _
5个回答

要在64位多架构的Ubuntu系统上运行32位可执行文件,您需要添加架构并安装三个库包、和。
sudo dpkg --add-architecture i386

如果您使用的是Ubuntu 12.04 LTS(Precise Pangolin)或更早版本,请使用以下方法:
echo "foreign-architecture i386" > /etc/dpkg/dpkg.cfg.d/multiarch

然后:

sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386

如果失败了,也要继续努力。
sudo apt-get install multiarch-support

完成这些步骤后,您应该能够运行32位应用程序。
./example32bitprogram

@AvinashRaj 这个对我很有帮助!不过,最后一个命令“sudo ./adb”实际上是用来做什么的? - Marcel
1它执行当前目录中存在的32位adb二进制文件。 - Avinash Raj
1为了在Ubuntu 14.04上让aapt工作,我不得不安装lib32z1,但是注意到它还会引入libc6-i386(请注意连字符,而不是冒号)。 - Chris Betti
1我按照你的步骤进行了操作,libc6:i386libncurses5:i386libstdc++6:i386都是最新版本,并且已设置为手动安装。但之后出现了以下错误提示:“无法安装某些软件包。这可能意味着您请求了一个不可能的情况,或者您正在使用不稳定的发行版...”,并且存在未满足的依赖关系:libstdc++6-4.4-dev:i386依赖于g++-4.4:i386(无法安装)。还有一些关于libstdc++6-4.4/6/7等的冲突问题。请问是否有什么问题,或者我应该保持当前状态不变? - Fredrick Gauss
@FredrickGauss 进入这里 - Avinash Raj
我进不去那里,但目前看起来还是能工作的,谢谢。 - Fredrick Gauss
我知道这是一个Ubuntu的问答,但是万一有人来到这里(就像我一样),那个步骤也适用于Debian Stretch 9.0 x64。 - Antônio Medeiros
完全卡住了,就像@FredrickGauss在新安装的Ubuntu 14.04.6上一样。libstdc++6:i386被依赖项阻塞,之后又是一个又是一个的依赖项阻塞。只能切换到32位安装。 - juanitogan
@FredrickGauss 只有libstdc++6:i386存在冲突,我安装了其他的包,它可以正常工作。 - netawater
我使用sudo apt-add-architecture i386和sudo apt update之后,我的Ubuntu 18.06启动进入tty界面,这正常吗? - franzeph

当你有二进制文件但缺少一些库时,可能会出现“没有此文件或目录”的错误。如果你安装了build-essential软件包,就可以使用ldd命令。这个命令ldd ./adb | grep not将显示缺少的库。只需在i386架构上使用apt安装这些库。像这样:apt-get install libmissing:i386请注意,一些有缺陷的软件包会尝试先删除64位版本。

谢谢,那可以解释这个奇怪的错误信息。起初我很困惑为什么bash会给我这个错误(而不是一些更清楚地来自缺少库的子进程的错误),但现在我猜测bash只是看到exec(3)返回ENOENT并打印出来。 - Thomas Stuefe

除了Zanna和Avinash Raj的出色回答之外,我还需要安装gcc-multilib。
sudo apt-get install gcc-multilib

可能是因为我想在64位系统上运行旧版本的gcc。

如果你想使用"adb",有一个专门的软件包可以供你使用。
sudo apt-get install android-tools-adb

关于32位库,只有以下内容:
sudo apt-add-architecture i386

足够了。

谢谢你的建议,但是我想使用从谷歌下载的安卓工具,而不是Ubuntu软件源中的工具。对于那个软件包的完整性我也不太确定。 - Thomas Stuefe
Ubuntu软件仓库必须拥有最新的版本。该软件包只包含adb。如果你想要fastboot - 也有相应的软件包 :) - aastefanov

只是对Zanna的补充: 以下解决了Android Studio的“无法安装库”的问题:
sudo apt-get install libdb1-compact tzdata initscripts

这个替换了丢失的库libstdc++6-i386,可能是因为该软件包已经过时。不确定为什么这个特定的库很重要。