web-dev-qa-db-ja.com

Linux用の32ビット実行可能Windowsサブシステムのexec形式エラー

gcc -m32 main.c -o mainでコンパイルされた32ビットファイルをLinuxのWindowsサブシステムで実行しようとすると、bash: ./main: cannot execute binary file: Exec format errorのエラーが発生します。

コンパイルするとなし-m32が実行されます。

WSLで32ビット実行可能ファイルを実行するための解決策はありますか?

15
Ford1892

32ビットELFのサポートは、WSLではまだ提供されていません。 UserVoiceが上げられて以来、何の進展もないようです-あなたは運が悪いです。

serVoice:32ビットELFサポートをカーネルに追加してください および 2ビットi386 ELFバイナリのサポート を参照してください。

可能であれば、realLinuxに切り替えます;-)

8
P.P.

QEMUとbinfmtは軽い方法をサポートします:)

https://github.com/Microsoft/wsl/issues/2468#issuecomment-37490452

WSLとWindowsプロセス間のWSLInteropがbinfmtを使用していることを読んだ後、QEMUをいじくり回していくつかのARM開発を試み、32ビットサポートを機能させる方法を偶然発見しました。

編集: "Fall Creators Update"、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
21
Froosh