Gcc Exec格式错误32位可执行Windows子系统Linux版?

Gcc Exec格式错误32位可执行Windows子系统Linux版?,gcc,executable,windows-subsystem-for-linux,32-bit,executable-format,Gcc,Executable,Windows Subsystem For Linux,32 Bit,Executable Format,当我试图在Windows Linux子系统上执行使用gcc-m32 main.c-o main编译的32位文件时,我遇到以下错误:bash:./main:无法执行二进制文件:Exec格式错误 如果我编译它时没有-m32,它会运行 在WSL上运行32位可执行文件的任何解决方案 WSL尚未提供32位ELF支持。自从UserVoice被提升以来,似乎没有任何进展——你运气不好 见和 如果可能,切换到真正的Linux;-) 由于这是最初发布的,支持已经在WSL2上提供,它确实支持!因此,这应该是首选的

当我试图在Windows Linux子系统上执行使用
gcc-m32 main.c-o main
编译的32位文件时,我遇到以下错误:
bash:./main:无法执行二进制文件:Exec格式错误

如果我编译它时没有
-m32
,它会运行


在WSL上运行32位可执行文件的任何解决方案

WSL尚未提供32位ELF支持。自从UserVoice被提升以来,似乎没有任何进展——你运气不好

见和

如果可能,切换到真正的Linux;-)


由于这是最初发布的,支持已经在WSL2上提供,它确实支持!因此,这应该是首选的方式


如链接中所述,如果仍然使用WSL1,也可以使用
qemu用户

qemu和binfmt支持指示灯:)

在读到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
因此,使用Linux虚拟机实际上可以做Linux虚拟机可以做的任何事情,包括运行32位代码。只需通过运行

sudo dpkg --add-architecture i386
sudo apt-get update
欲了解更多信息,请阅读


.c
.s
是源代码文件。它们不能直接执行,而且通常不是C编译器或汇编程序的输出。我知道,我的意思是我编译一个main.C文件并执行32位可执行文件。/main我对此不太确定,无法将其作为答案发布,但我相信WSL本身就是一个64位进程。您不能在64位进程中运行32位可执行文件(或加载32位库)。相关:WSL不支持64位可执行文件中的32位
int 0x80
系统调用,因此将asm构建为64位没有帮助,除非您还使用了适当的
syscall
系统调用ABI。适用于我,WIN10 1803,WSL,Ubuntu18.04 LTS linux g++-8非常好,谢谢!Windows 10 v1803 WSL Ubuntu 16.04如果我安装了64位gcc,那么当我运行
sudo apt install gcc:i386
时,它给了我以下错误:
以下软件包有未满足的依赖项:gcc:i386:dependens:cpp:i386(>=4:7.3.0-3ubuntu2.1),但它不会被安装dependens:gcc-7:i386(>=7.3.0-27~)但它不会被安装E:无法纠正问题,您持有的软件包已损坏
我将尝试使用此处提到的方法()我不擅长处理apt安装问题,因此我保留了几个WSL安装,以满足不同的需要(例如i386 vs x64等)。正如您所提到的,单独的chroot/容器也应该完成这项工作。对于WSL OpenSuse,将
qemu-i386-binfmt
(来自'qemu-linux-user'包),而不是更新binfmts行中的
qemu-i386-static
。您可能还需要
sudo apt获得安装gcc multilib g++-multilib libc6:i386
,如图所示,没有安装线它就无法工作。这个答案似乎过时了。