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

时间:2017-02-08 18:30:46

标签: gcc windows-subsystem-for-linux

当我尝试在 Windows子系统Linux 上执行使用gcc -m32 main.c -o main编译的32位文件时,出现以下错误:bash: ./main: cannot execute binary file: Exec format error

如果我编译它没有 -m32它就会运行。

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

感谢。

3 个答案:

答案 0 :(得分:16)

QEMU和binfmt支持照明方式:)

https://github.com/microsoft/wsl/issues/2468#issuecomment-374904520

在读到WSL和Windows进程之间的WSLInterop使用了binfmt之后,我正在修补QEMU尝试一些ARM开发,并顺便发现了如何让32位支持工作。

编辑:需要" Fall Creators更新",1709,构建16299或更新

安装qemu和binfmt config:

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

答案 1 :(得分:6)

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

请参阅UserVoice: Please add 32 bit ELF support to the kernelSupport for 32-bit i386 ELF binaries

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

答案 2 :(得分:2)

WSL2 runs in a real virtual machine使用real Linux kernel,因此实际上有可能做Linux VM可以做的任何事情,包括运行32位代码。只需运行即可安装32位库

sudo dpkg --add-architecture i386
sudo apt-get update

有关更多信息,请阅读