Ошибка формата exec 32-битная исполняемая подсистема Windows для Linux?

Когда я пытаюсь выполнить 32-битный файл, скомпилированный с gcc -m32 main.c -o main в подсистеме Windows для Linux я получаю следующую ошибку: bash: ./main: cannot execute binary file: Exec format error,

Если я скомпилирую это без -m32 это работает.

Любое решение для запуска 32-битного исполняемого файла на WSL?

Благодарю.

2 ответа

Решение

Поддержка 32-битного ELF не предоставляется WSL (пока). Похоже, никакого прогресса не было с тех пор, как подняли UserVoice - вам не повезло.

См. UserVoice: пожалуйста, добавьте 32-битную поддержку ELF в ядро и поддержку 32-битных двоичных файлов i386 ELF.

Если возможно, переключитесь на настоящий Linux;-)

QEMU и binfmt поддерживают свет:)

https://github.com/microsoft/wsl/issues/2468

После прочтения, что WSLInterop между процессами WSL и Windows использует binfmt, я возился с QEMU, чтобы попытаться разработать ARM, и случайно обнаружил, как заставить работать 32-битную поддержку.

Редактировать: требуется "Обновление создателей осени", 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'

Вам нужно будет заново активировать поддержку binfmt при каждом запуске WSL:

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

WSL2 работает на реальной виртуальной машине с использованием реального ядра Linux, поэтому на самом деле можно делать все, что может делать виртуальная машина Linux, включая запуск 32-разрядного кода. Просто установите 32-битные библиотеки, запустив

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

Для получения дополнительной информации прочтите

Другие вопросы по тегам