在 Linux 的 Windows 子系统上的 Ubuntu 上运行 32 位应用程序

Ale*_*lex 8 32-bit application-launch ubuntu windows-10 windows-subsystem-for-linux

我有一个使用g++ -m32标志编译的非常简单的应用程序。

不幸的是,当我尝试运行它时,出现错误:

bash: ./a.out: cannot execute binary file: Exec format error
Run Code Online (Sandbox Code Playgroud)

如果编译-m32没有错误,它会按预期运行。

什么可能是问题,是否有可能解决?

编辑:

  1. 编译g++ -m32 --static并不能解决问题。
  2. 安装程序是 Windows 10 上的 Ubuntu 子系统。

phu*_*clv 13

更新(WSL2)

WSL2 在使用真实 Linux 内核的真实虚拟机中运行,因此实际上可以执行 Linux VM 可以执行的任何操作,包括运行 32 位代码。只需通过运行安装 32 位库

sudo dpkg --add-architecture i386
sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

但同样,您真的应该选择 64 位版本,尤其是如果您有源代码。与 64 位版本相比,32 位 Linux 的维护要少得多,因为在过去十年中,只有 32 位的硬件少得多,而且用户和测试人员的数量也少得多。一个例子是 32 位 Linux 的 Meltdown/Spectre 补丁比 64 位版本晚了半年多,而且多年后仍然有问题


原答案

你根本不能那样做。WSL 不支持 32 位应用程序!

过去十年中的大多数(如果不是全部)Intel 和 AMD CPU 都支持 x86_64 指令集,Microsoft 没有理由花时间和金钱来支持 32 位版本的 Linux。无论如何,大多数开发人员和 Ubuntu 用户都在运行 64 位版本

不,我们目前不支持 x86 32 位:我们目前依赖 x64-only 指令和机制来确保快速和稳定的性能。

在 Windows 上的 Ubuntu 上重击


  • 我正在使用 WSL 为 32 位 ARM 平台构建和运行单元测试,因此在 32 位数据类型和指针之间具有一定的字长等价性,这在 64 位系统中运行时不存在。因此,这种遗漏很烦人! (2认同)