bash: ./*.exe: 没有名为 *.exe 的可执行文件的文件或目录

bash: ./*.exe: 没有名为 *.exe 的可执行文件的文件或目录

看起来我无法运行任何正常的 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 可执行文件的规则。

相关内容