Exec format error Windows 32-bit executable subsystem for Linux?

When I try to execute a 32-bit file compiled with gcc -m32 main.c -o main in the Windows subsystem for Linux, I get the following error: bash: ./main: cannot execute binary file: Exec format error .

If I compile it without -m32 , it will start.

Any solution for a 32 bit executable file on WSL ?

Thanks.

+5
source share
2 answers

32-bit ELF support is not provided by WSL (yet). It seems that there has been no progress since UserVoice - you are out of luck.

See UserVoice: Add 32-bit ELF support to the kernel and Support for 32-bit i386 ELF binaries .

If possible, switch to real Linux; -)

+3
source

QEMU and binfmt support make it easy :)

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

After reading that WSLInterop used binfmt between WSL and Windows processes, I worked on QEMU to try some ARM designs and accidentally discovered how to work with 32-bit support.

Edit: Requires Fall Creators Update, 1709, build 16299 or later

Install qemu and binfmt configuration:

 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' 

You will need to reactivate binfmt support every time you start WSL:

 sudo service binfmt-support start 

Enable i386 architecture packages:

 sudo dpkg --add-architecture i386 sudo apt update sudo apt install gcc:i386 

Try:

 $ 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 

And to make sure it really works, disable i386 support and try again:

 $ sudo service binfmt-support stop * Disabling additional executable binary formats binfmt-support [ OK ] $ ./helloworld -bash: ./helloworld: cannot execute binary file: Exec format error 
+2
source

Source: https://habr.com/ru/post/1263981/


All Articles