為什麼某些 WSL2 安裝允許 elf 執行檔、win 執行檔或兩者兼有?
我試圖弄清楚發生了什麼。我觀察以下。
- 在 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
編輯我計劃下次與使用者會面時收集更多資訊,例如:
- 視窗版
- WSL 版本
- 終端外殼/如何呼叫終端
我一直無法再次與使用者見面,但我相信我已經弄清楚發生了什麼。
- WSL 支持 UPX 壓縮二進製文件的歷史參差不齊。我們的二進製文件一直是 UPX 壓縮的,但 WSL 對此的支持隨時間而變化。我現在禁用了 UPX 壓縮,並且每個 linux 發行版(包括 WSL)的二進制執行都沒有問題。
- 由於新的誤報 Windows Defender 狀態,Windows 現在會自動從使用者電腦中刪除我們的 exe。這導致使用者 1 在實際程序不存在時報告“程序未正確執行並給出錯誤”,這是一個完全不同的錯誤。我已將特定於 Windows 的支持回滾到未觸發此行為的早期版本,因此暫時無法以最佳方式解決此問題。
不是一個完整的答案,但是當您收集更多資訊時,我會回來。
但就目前而言,您提到使用者 #2 案例令人驚訝,其中 elf 和 Windows (PE) 二進製文件都執行。
但這是 WSL 的“正常”情況。只要指定了全名(包括
.exe
副檔名),WSL 就允許執行 Windows 二進製文件。例如,notepad.exe
在 WSL 中執行幾乎總是使用開箱即用的預設值。它通過
binfmt_misc
在初始化期間向 Linux 註冊 PE 格式來實現這一點。您可以通過cat /proc/sys/fs/binfmt_misc/WSLInterop
. 有趣(對我來說,無論如何)TIL 旁注指出,指定 Windows 二進製文件的 4d5a 的魔法字節源於原始 DOS PE 格式,這些是十六進制 ASCII 字元“mz”,代表 Mark Zbikowsky,原始文件之一DOS建築師。請注意,可以通過多種方式禁用此支持,因此如果使用者無法執行 Windows 二進製文件,請檢查上述結果
cat /proc/sys/fs/binfmt_misc/WSLInterop
。此外,正如您所提到的,請檢查 WSL 版本以及有關執行檔的更多資訊。執行檔是為 32 位還是 64 位架構編譯的?如果我沒記錯的話,WSL1 只能執行 64 位二進製文件,但 WSL2 可以同時執行兩者。