私は何が起こっているのかを理解しようとしています。以下を観察しました。
- Windows 10でコンパイルされたexeバイナリ
- CentOS7でコンパイルされたelfバイナリ
musl
- ユーザー1 WSL2:(
elf binary runs, exe binary runs
更新済み) - ユーザー 2 WSL2:
elf binary error, exe binary runs (surprised #1)
- ユーザー3 WSL2:
elf binary runs, exe binary runs (surprised #2)
これらのエラーは、プログラムの競合ではなく、オペレーティングシステムの実行可能なフォーマットエラーです。
新しいコンピュータでユーザー1の経験を再現できますが、他のユーザーがなぜそのような経験をするのかはわかりません。画面共有を通じて、彼らが何を観察しているかを確認しました。
編集次のセッションでユーザーの詳細を理解できるようになると、WSLはさまざまな種類の実行可能ファイルの実行の互換性と時間の経過とともに変更する方法に関するいくつかの情報を助けることができます。 https://stackoverflow.com/questions/38920710/how-can-i-run-a-windows-executable-from-wsl-ubuntu-bash
編集次回ユーザーに会うときに、より多くの情報を収集する予定です。例:
- Windowsのバージョン
- WSLバージョン
- 端末シェル/端末呼び出し方法
答え1
これは完全な答えではありませんが、より多くの情報を収集した場合は、これについてもう一度言及します。
ところで、今、elfとWindows(PE)バイナリの両方が実行されているユーザー#2のケースについて驚いたと言われました。
しかし、これはWSLの場合は「通常」です。 WSLは、フルネーム(拡張名を含む)が指定されている限り、Windowsバイナリの実行を許可します.exe
。たとえば、notepad.exe
WSLで実行すると、ほぼ常にデフォルト設定を使用できます。
これは、init中にLinuxにPEフォーマットを登録することによって行われますbinfmt_misc
。でこれを確認できますcat /proc/sys/fs/binfmt_misc/WSLInterop
。 (とにかく私にとって興味深いTILに関する注意事項は、Windowsバイナリ用の4d5aを指定するマジックバイトが元のDOS PE形式に由来していたことです。建築家。
ちなみにこのサポートはできるさまざまな方法で無効にできるため、ユーザーがWindowsバイナリを実行できない場合は、上記cat /proc/sys/fs/binfmt_misc/WSLInterop
の結果を確認してください。
また、あなたが言ったように、WSLのバージョンと実行可能ファイルに関する詳細情報を確認してください。実行可能ファイルは32ビットまたは64ビットアーキテクチャ用にコンパイルされますか?私の記憶が正しい場合、WSL1は64ビットバイナリのみを実行できますが、WSL2は両方とも実行できます。
答え2
そのユーザーに再会することはできませんでしたが、何が起こったのかを理解したと思います。
WSL は UPX 圧縮バイナリのサポートにおいて混合された歴史を持っています。私たちのバイナリは常にUPX圧縮されていますが、それに対するWSLのサポートは時間の経過とともに変わりました。これでUPX圧縮が無効になり、バイナリはすべてのLinuxディストリビューション(WSLを含む)で問題なく実行されます。
新しい誤検出 Windows Defender の状態により、Windows はユーザーのコンピュータから exe を自動的に削除します。これにより、ユーザー1は実際にはプログラムが存在せず、まったく異なるエラーであったにもかかわらず、「プログラムが正しく実行されず、エラーが発生しました」と報告しました。 Windows 関連のサポートをこの動作を引き起こさない以前のバージョンにロールバックしたため、現時点ではこの問題に対する最善の解決策はありません。