![](/img/trans.png)
[英]How to compile C-code on a 64-bit Linux system for an ARM 32-bit executable
[英]Exec format error 32-bit executable Windows Subsystem for Linux?
当我尝试在Windows Subsystem for Linux上执行使用gcc -m32 main.c -o main
编译的 32 位文件时,出现以下错误: bash: ./main: cannot execute binary file: Exec format error
。
如果我在没有-m32
情况下编译它,它会运行。
在 WSL 上运行 32 位可执行文件的任何解决方案?
QEMU 和 binfmt 支持点亮方式:)
https://github.com/microsoft/wsl/issues/2468#issuecomment-374904520
看到WSL和Windows进程之间的WSLInterop使用了binfmt之后,我正在摆弄QEMU尝试一些ARM的开发,偶然发现了如何让32位支持工作。
编辑:需要“秋季创作者更新”,1709,构建 16299 或更新
安装 qemu 和 binfmt 配置:
sudo apt install qemu-user-static
sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xff\xff\xff\xff\xff\xff\xff'
每次启动 WSL 时都需要重新激活 binfmt 支持:
sudo service binfmt-support start
启用 i386 架构包:
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install gcc:i386
试试看:
$ file /usr/bin/gcc-5
/usr/bin/gcc-5: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=2637bb7cb85f8f12b40f03cd015d404930c3c790, stripped
$ /usr/bin/gcc-5 --version
gcc-5 (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gcc helloworld.c -o helloworld
$ ./helloworld
Hello, world!
$ file helloworld
helloworld: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=3a0c7be5c6a8d45613e4ef2b7b3474df6224a5da, not stripped
为了证明它确实有效,请禁用 i386 支持并重试:
$ sudo service binfmt-support stop
* Disabling additional executable binary formats binfmt-support [ OK ]
$ ./helloworld
-bash: ./helloworld: cannot execute binary file: Exec format error
WSL(目前)不提供 32 位 ELF 支持。 自从 UserVoice 被提出以来,似乎没有任何进展——你走运了。
请参阅UserVoice: Please add 32 bit ELF support to the kernel和Support for 32-bit i386 ELF binaries 。
如果可能,请切换到真正的Linux ;-)
由于这是最初发布的,WSL2 上已经提供了支持,它确实支持真正的 Linux 内核! 所以这应该是首选方式。
正如链接的github 问题中所述,如果仍然使用 WSL1,也可以使用qemu-user
。
WSL2 在使用真正Linux 内核的真实虚拟机中运行,因此实际上可以执行 Linux VM 可以执行的任何操作,包括运行 32 位代码。 只需通过运行安装 32 位库
sudo dpkg --add-architecture i386
sudo apt-get update
欲了解更多信息,请阅读
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.