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

8
我在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:无法执行二进制文件:Exec format error
我已经做了很多搜索来尝试解决此问题,并安装了apt:libc6:i386、libncurses5:i386 和 libstdc++6:i386。
如果您有其他想法来解决这个问题,将不胜感激。

file ./a.out 告诉你什么?你能运行 64 位二进制文件(没有 -m32 编译)吗? - Hadi Brais
@HadiBrais 我可以运行64位二进制文件而不需要 -m32,当我使用 -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 - G3yost
它应该显示为ELF 32-bit LSB可执行文件...而不是ELF 32-bit LSB共享对象...为什么编译器会生成一个共享对象?它应该生成一个可执行文件。使用./a.out无法运行共享对象。 - Hadi Brais
@HadiBrais 嗯...我会研究一下。我不确定为什么我没有想到在 -m32-m64 可执行文件上比较 file。我迫不及待地想要深入探究这个问题。谢谢! - G3yost
很高兴我能够提供帮助。请尽量让我了解该问题的最新情况。 - Hadi Brais
1个回答

13

您需要安装32位的库,例如:

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

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


1
如果您安装了libc6-i386,则不需要添加架构。如果您添加了i386架构,那么最好安装libc6:i386。不是吗? - Marc Glisse
1
我已经按照你上面的所有步骤操作了,但是当我执行 apt install libc6-i386 命令时,apt 显示它已经是最新版本了。从这里开始有什么建议吗?感谢你的帮助。 - G3yost
@MarcGlisse 顺便说一下,我也遇到了同样的问题。我已经尝试安装了libc6-i386,但没有帮助:我无法运行32位二进制文件;我仍然缺少/lib/ld-linux.so。添加架构步骤是让我成功的关键,我非常感谢Xypron的建议。 - Steve Summit

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