Debian

bash: ./*.exe: 沒有帶有名為 *.exe 的執行檔的文件或目錄

  • May 5, 2021

看起來我不能執行任何普通的 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 執行檔。

引用自:https://unix.stackexchange.com/questions/647907