我试图弄清楚发生了什么。我观察以下。
- 在 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 版本
- 终端外壳/如何调用终端
不是一个完整的答案,但是当您收集更多信息时,我会回来。
但就目前而言,您提到用户 #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 可以同时运行两者。
我一直无法再次与用户见面,但我相信我已经弄清楚发生了什么。
WSL 支持 UPX 压缩二进制文件的历史参差不齐。我们的二进制文件一直是 UPX 压缩的,但 WSL 对此的支持随时间而变化。我现在禁用了 UPX 压缩,并且每个 linux 发行版(包括 WSL)的二进制运行都没有问题。
由于新的误报 Windows Defender 状态,Windows 现在会自动从用户计算机中删除我们的 exe。这导致用户 1 在实际程序不存在时报告“程序未正确运行并给出错误”,这是一个完全不同的错误。我已将特定于 Windows 的支持回滚到未触发此行为的早期版本,因此暂时无法以最佳方式解决此问题。