我有一个用标志编译的非常简单的应用程序g++ -m32
。
不幸的是,当我尝试运行它时出现错误:
bash: ./a.out: cannot execute binary file: Exec format error
如果没有编译则-m32
没有错误并且它会按预期运行。
这可能是一个什么问题?有可能解决吗?
编辑:
- 编译并
g++ -m32 --static
不能解决问题。 - 安装是 Windows 10 上的 Ubuntu 子系统。
答案1
更新(WSL2)
WSL2 在真实的虚拟机中运行用一个真正的Linux内核,因此实际上可以执行 Linux VM 可以执行的任何操作,包括运行 32 位代码。只需运行以下命令安装 32 位库:
sudo dpkg --add-architecture i386
sudo apt-get update
但同样,你应该选择 64 位版本,特别是如果你有源代码的话。32 位 Linux 的维护比 64 位版本少得多,因为过去十年中 32 位硬件的数量少得多,用户和测试人员的数量也少得多。一个例子是 32 位 Linux 的 Meltdown/Spectre 补丁半年多后才问世比 64 位版本更高,并且几年后它仍然有问题
原始答案
你根本就不能这么做。WSL 不支持 32 位应用程序!
过去十年中,大多数(如果不是全部)英特尔和 AMD CPU 都支持 x86_64 指令集,微软没有理由花时间和金钱来支持 32 位版本的 Linux。无论如何,大多数开发人员和 Ubuntu 用户都在运行 64 位版本
不,我们目前不支持 x86 32 位:我们目前依赖仅限 x64 的指令和机制来确保快速稳定的性能。
- 支持 32 位 i386 ELF 二进制文件
- 请启用 WSL 来运行 32 位 ELF 二进制文件
- Exec 格式错误 32 位可执行文件 Windows Subsystem for Linux?
- 适用于 Linux 的 Windows 子系统概述:我们最近宣布在 Windows 上启用 Ubuntu 上的 Bash,它支持原生Linux ELF64 二进制文件通过 Windows Subsystem for Linux (WSL) 在 Windows 上运行
答案2
除了 wsl 2 的答案之外,我还必须安装,sudo apt-get install gcc-multilib
以便 libc6 已安装并且可以执行 ELF 32 位