Debian
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 秒,我記得存在這樣的東西來為 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
現在可以了
大多數 UNXes,包括 Linux,通過出現在文件開頭或附近的“幻數”辨識本機執行檔(ELF 文件,在大多數現代 UNXes 的情況下,包括 Linux)。
Windows 二進製文件是Portable Executable 格式,它也有幻數 - 文件以存根 MS-DOS 執行檔開頭,它以包含字母“MZ”的幻數開頭,還有一個單獨的“PE”幻數,在可變偏移處。
根據binfmt_misc 的 kernel.org 文件,binfmt_misc 規則可以基於文件內容 - 例如,查找幻數 - 而不是文件副檔名。他們為 Wine 提供的範例規則是
:DOSWin:M::MZ::/usr/local/bin/wine:
由於您沒有安裝 Wine,因此完全刪除該規則是正確的解決方法。如果您曾經安裝過 Wine 並且確實希望能夠以與執行 Linux 二進製文件相同的方式執行 Windows 二進製文件,那麼您應該使用類似於範例規則的規則,而不是告訴核心假設任何以 .exe 結尾的規則是一個 Windows 執行檔。