我正在尝试弄清楚发生了什么事。我观察到以下情况。
- 在 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版本
- 终端 shell / 如何调用终端
答案1
这不是一个完整的答案,但当您收集更多信息时我会再讨论这个问题。
但现在,您提到了对用户 #2 案例的惊讶,其中 elf 和 Windows (PE) 二进制文件都运行。
但这是 WSL 的“正常”情况。只要指定全名(包括扩展名),WSL 就允许执行 Windows 二进制文件.exe
。例如,notepad.exe
在 WSL 中执行几乎总是可以使用开箱即用的默认设置。
它通过在 init 期间向 Linux 注册 PE 格式来实现这一点binfmt_misc
。您可以通过 看到这一点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 可以运行两者。
答案2
我还无法再次与用户见面,但我相信我已经弄清楚发生了什么事。
WSL 在支持 UPX 压缩二进制文件方面的历史参差不齐。我们的二进制文件始终采用 UPX 压缩,但 WSL 对此的支持随着时间的推移而变化。我现在已经禁用了 UPX 压缩,并且二进制文件可以在每个 Linux 发行版(包括 WSL)上运行,没有任何问题。
由于新的误报 Windows Defender 状态,Windows 现在会自动从用户计算机中删除我们的 exe。这导致用户 1 报告“程序运行不正确并给出错误”,而实际上该程序并不存在,这是一个完全不同的错误。我已将特定于 Windows 的支持回滚到未触发此行为的早期版本,因此暂时无法最佳地解决此问题。