1. 目的
WSL1上のlinux(Ubuntu, 64bit)で32bitの実行可能ファイル(ELF 32-bit LSB executable)を実行したい。
2. 環境
- Windows10 Home
バージョン: 21H2 - Windows Terminal
バージョン: 1.11.3471.0 - ┗ Ubuntu 20.04.3 LTS (WSL1)
(GNU/Linux 4.4.0-19041-Microsoft x86_64)
3. とりあえず実行しようとするとどうなるか
例として32bit実行可能ファイルの名前をexecute
とする。
ふつうは
$ ./execute
で実行できるが、32bitファイルの場合、
-bash: ./execute: cannot execute binary file: Exec format error
というエラーが出てしまう。
4. 調べて試してみたこと
64bitOSで32bitの実行可能ファイルを動かすためにはライブラリをインストールすればよいとのことなので、いろいろ入れてみる。
4.1 gcc-multilibとg++-multilib
どこで見たかは忘れてしまったが、gcc-multilib
とg++-multilib
を入れればよいと聞いた。しかしこれらをインストールしても実行はできなかった。
(2023-08-02追記)
WSL2(Ubuntu 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
の実行*3wsl --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