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

pre*_*k.v 15 debian executable

看起来我不能运行任何正常的 linux 二进制文件,如果它们的名字以 结尾.exe,知道为什么吗?

$ cp /bin/pwd pwd
$ ./pwd
/home/premek
Run Code Online (Sandbox Code Playgroud)

还行吧。但...

$ 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

Run Code Online (Sandbox Code Playgroud)

pre*_*k.v 28

我在这个问题上花了一天时间,当然在发布这个问题 1 秒后,我想起了这样的事情来为 wine 注册 .exe 文件:

$ sudo cat /proc/sys/fs/binfmt_misc/wine 
enabled
interpreter /usr/bin/wine
flags: 
extension .exe
Run Code Online (Sandbox Code Playgroud)

并且/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
Run Code Online (Sandbox Code Playgroud)

现在可以用了


小智 17

大多数 UN*Xes,包括 Linux,通过出现在文件开头或附近的“幻数”识别本地可执行文件(ELF 文件,在大多数现代 UN*Xes 的情况下,包括 Linux)。

Windows 二进制文件采用Portable Executable 格式,它也有幻数——文件以存根 MS-DOS 可执行文件开头,它以包含字母“MZ”的幻数开头,还有一个单独的“PE”幻数,在一个可变的偏移量。

根据binfmt_misc 的 kernel.org 文档,binfmt_misc 规则可以基于文件内容 - 例如,寻找幻数 - 而不是文件扩展名。他们为 Wine 提供的示例规则是

:DOSWin:M::MZ::/usr/local/bin/wine:
Run Code Online (Sandbox Code Playgroud)

由于您没有安装 Wine,因此完全删除规则是正确的解决方法。如果您曾经安装过 Wine 并且确实希望能够以可以运行 Linux 二进制文件的相同方式运行 Windows 二进制文件,您应该使用类似于示例规则的规则,而不是告诉内核假设任何以 .exe 结尾的规则是一个 Windows 可执行文件。