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 可执行文件。
归档时间: |
|
查看次数: |
1773 次 |
最近记录: |