无法在 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 上运行,原因是