日記

日本語の勉強のためのブログ

WSLで32bit実行可能ファイルを動かす(+WSL2にアップデートするメモ)

1. 目的

WSL1上のlinux(Ubuntu, 64bit)で32bitの実行可能ファイル(ELF 32-bit LSB executable)を実行したい。

2. 環境

3. とりあえず実行しようとするとどうなるか

例として32bit実行可能ファイルの名前をexecuteとする。
ふつうは $ ./execute で実行できるが、32bitファイルの場合、 -bash: ./execute: cannot execute binary file: Exec format error というエラーが出てしまう。

4. 調べて試してみたこと

64bitOSで32bitの実行可能ファイルを動かすためにはライブラリをインストールすればよいとのことなので、いろいろ入れてみる。

4.1 gcc-multilibとg++-multilib

どこで見たかは忘れてしまったが、gcc-multilibg++-multilibを入れればよいと聞いた。しかしこれらをインストールしても実行はできなかった。

(2023-08-02追記)
WSL2Ubuntu 22.04.2)の場合,gcc-multilibをインストールしたところ実行できた.
検証に使用した32bit実行可能ファイルは難解プログラミング言語"Whitespace"のインタプリタここから入手できる.

4.2 lib32z1

lib32z1を入れればよいとも聞いたが、これでも実行には至らなかった。

https://ameblo.jp/p3n-ctf/entry-12363737412.html

4.3 そもそもWSLでは実行できない!?

32bit実行可能ファイルはWSLでは実行できないという説が浮上した。

https://backport.net/blog/2018/09/25/kindlegen_on_wsl/ https://blog.tmyt.jp/entry/2018/05/27/065347

4.4 WSL2では実行できる?

WSL2 elf32で検索すると、WSL2では実行できるという話も出ている。

https://stackoverflow.com/questions/61300194/does-wsl-2-really-support-32-bit-program

5. WSL2にアップデートしてみる

というわけで、WSL2にアップデートすることにした。

Powershellを管理者として開き、 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart仮想マシンプラットフォーム機能を有効にする。

PS C:\Users\***> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

展開イメージのサービスと管理ツール
バージョン: 10.0.19041.844

イメージのバージョン: 10.0.19044.1586

機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。

終わったら再起動する(そうしないと次の工程に進めない)。

その後wsl --set-version ubuntu 2でWSL2に更新する。

5.1 問題発生

Windows の仮想マシン プラットフォーム機能を有効にして、BIOS で仮想化が有効になっていることを確認してください。と言われたが、BIOSで仮想化は有効にしてある(タスクマネージャのCPUの欄で確認できる*1 )し、上で仮想マシンプラットフォーム機能も有効にしてある。

いろいろ調べて、手当たり次第に次のことを行った。

  • "Windows ハイパーバイザー プラットフォーム"の有効化*2
  • bcdedit /set hypervisorlaunchtype autoの実行*3
  • wsl --set-default-version 2の実行(更新後に実行するコマンドだが、このタイミングで実行してみた)

その後再起動し、再度wsl --set-version ubuntu 2してみると更新が始まった。

PS C:\WINDOWS\system32> wsl --set-version Ubuntu 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。

結構時間かかると聞いていたが、自分の場合は10分ほどで終了した。更新中はPCの動作がとても重くなるため、放置するのがよい。

更新が無事に済んだらWSLバージョンの確認を行い、ちゃんとVERSIONが2になっているか確かめる。

PS C:\WINDOWS\system32> wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Stopped         2

これでWSL2へのアップデートが完了した。

6. WSL2で32bitファイルを実行してみる

第4節でいろいろライブラリを入れておいたおかげなのか、普通に$ ./executeと実行したら動いた。


7. 参考文献

https://docs.microsoft.com/ja-jp/windows/wsl/install#upgrade-version-from-wsl-1-to-wsl-2