看起来我无法运行任何正常的 Linux 二进制文件,如果它们的名称以 结尾.exe
,知道为什么吗?
$ cp /bin/pwd pwd
$ ./pwd
/home/premek
还行吧。但...
$ cp /bin/pwd pwd.exe
$ ./pwd.exe
bash: ./pwd.exe: No such file or directory
$ ls -la pwd.exe
-rwxr-xr-x 1 premek premek 39616 May 3 20:27 pwd.exe
$ file pwd.exe
pwd.exe: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=2447335f77d6d8c4245636475439df52a09d8f05, stripped
$ ls -la /lib64/ld-linux-x86-64.so.2
lrwxrwxrwx 1 root root 32 May 1 2019 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.28.so
$ ls -la /lib/x86_64-linux-gnu/ld-2.28.so
-rwxr-xr-x 1 root root 165632 May 1 2019 /lib/x86_64-linux-gnu/ld-2.28.so
$ file /lib/x86_64-linux-gnu/ld-2.28.so
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
答案1
我花了一天的时间在这个问题上,当然,在发布这个问题后 1 秒,我想起了这样的东西,可以为 wine 注册 .exe 文件:
$ sudo cat /proc/sys/fs/binfmt_misc/wine
enabled
interpreter /usr/bin/wine
flags:
extension .exe
并且/usr/bin/wine
不存在。
我使用以下方法摆脱了它:
$ sudo update-binfmts --remove wine /usr/bin/wine
update-binfmts: warning: no executable /usr/bin/wine found, but continuing anyway as you request
现在可以了
答案2
大多数 UN*Xes,包括 Linux,通过出现在文件开头或附近的“幻数”来识别本机可执行文件(ELF 文件,对于大多数现代 UN*Xes,包括 Linux)。
Windows 二进制文件位于便携式可执行格式,其中也有幻数 - 文件以存根 MS-DOS 可执行文件开头,以包含字母“MZ”的幻数开头,并且还有一个单独的“PE”幻数,其偏移量可变。
根据binfmt_misc 的 kernel.org 文档, binfmt_misc 规则可以基于文件内容 - 例如,寻找幻数 - 而不是基于文件扩展名。他们给出的 Wine 规则示例是
:DOSWin:M::MZ::/usr/local/bin/wine:
由于您没有安装 Wine,因此完全删除该规则是正确的修复方法。如果你曾经安装过 Wine 和做如果希望能够以与运行 Linux 二进制文件相同的方式运行 Windows 二进制文件,您应该使用类似于示例规则的规则,而不是告诉内核假定以 .exe 结尾的任何内容都是 Windows 可执行文件的规则。