无法在 64 位 Debian 上运行 32 位二进制文​​件

Posted

技术标签:

【中文标题】无法在 64 位 Debian 上运行 32 位二进制文​​件【英文标题】:Can't run 32 bit binary on 64 bit Debian 【发布时间】:2018-09-17 05:18:04 【问题描述】:

我正在 Debian Linux(64 位)上编译 C++,并且需要能够为另一个系统编译为 32 位。二进制文件无法在我的 64 位系统上运行,让它们运行会更方便测试。

我用于测试它的 C++ 是 int main () std::cout << "This is Main.cpp" << std::endl; ,其中包含 iostream,所以没什么好看的。

我的编译行是g++ -m32 Main.cpp

当我执行./a.out 时,我得到-bash: ./a.out: cannot execute binary file: Exec format error

我做了很多搜索试图解决这个问题并安装了 apt:libc6:i386、libncurses5:i386 和 libstdc++6:i386。

任何解决此问题的其他想法将不胜感激。

【问题讨论】:

file ./a.out 告诉你什么?你能运行 64 位二进制文​​件(编译时不用-m32)吗? @HadiBrais 我可以在没有 -m32 的情况下运行 64 位二进制文​​件,当我使用 -m32 编译以获得 32 位 a.out 并且我执行 file a.out 我得到a.out: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=e1483a60a1b26d9b3738bb963e90e713b515031b, not stripped 应该是ELF 32-bit LSB executable... 而不是ELF 32-bit LSB shared object... 为什么编译器会发出一个共享对象?它应该发出一个可执行文件。无法使用./a.out 运行共享对象。 @HadiBrais 嗯...我会调查的。我不知道为什么我不考虑在 -m32-m64 以前认为的可执行文件上比较 file。我迫不及待地想潜入那个兔子洞。谢谢! 很高兴我能帮上忙。请尽量让我了解这个问题。 【参考方案1】:

你需要安装32位的库,例如

dpkg --add-architecture i386
apt-get update
apt-get install libc6-i386

您可以使用 ldd 命令找出需要哪些库。 您可以使用 apt-file 来查找库的包。

【讨论】:

如果你安装了 libc6-i386,你应该不需要 add-architecture。如果你确实添加了 i386 架构,你还不如安装 libc6:i386。没有? 我做了你上面所做的一切,当我做时apt install libc6-i386 apt 说它已经是最新版本了。这里有什么建议吗?感谢您的帮助。 @MarcGlisse FWIW,我带着同样的问题来到这里。我已经尝试安装 libc6-i386,但没有帮助:我无法运行 32 位二进制文​​件;我仍然缺少/lib/ld-linux.so。 add-architecture 步骤使它对我有用,我非常感谢 Xypron 的建议。

以上是关于无法在 64 位 Debian 上运行 32 位二进制文​​件的主要内容,如果未能解决你的问题,请参考以下文章

在 64 位 Debian wheezy 多架构主机上编译使用 ssl 的 32 位二进制文​​件

32 位应用程序无法在 x64 Win2003 上运行,原因是

我无法在32位版本的IDLE上导入pygame。

使用 g++ -march=x86-64 构建的代码可以在 32 位操作系统上运行吗?

64 位窗口上的 Python 32 位内存限制

无法安装64位office