Linux如何确定用于运行(非文本)二进制文件的设施?


23

我了解Linux使用shebang行来确定用于脚本语言的解释器,但是对二进制文件如何工作?

我的意思是我可以运行Linux二进制文件,并且已经安装了winemono,Windows本机和.NET二进制文件。对于所有这些人来说,只是./binary-name(如果不在PATH中)可以运行它。

Linux如何确定给定的二进制文件必须作为Linux本机二进制文件,作为Windows本机二进制文件(使用Wine工具)或作为Windows .NET二进制文件(使用Mono工具)运行?

Answers:


29

一言以蔽之:binfmt_misc。这是特定于Linux的不可移植工具。

内核通过内置的逻辑识别出几种格式。即,这些是ELF格式(对于普通二进制文件)和shebang约定(对于脚本)。(感谢zwol提供以下答案)。另外,Linux可以识别几种深奥的,过时的或兼容性的内置格式。您可能不会遇到他们。它们是a.out“ em86”,“ flat”和“ elf_fdpic”。

其他所有内容都必须通过binfmt_misc系统进行注册。该系统使您可以在内核中注册基于幻数和相应解释器的简单模式检查。


6
尽管OP明确要求使用Linux,但值得注意的是,与可在Linux和其他类似Unix的系统上运行的许多其他解决方案不同,该解决方案完全针对Linux。
cubuspl42

6
它可能没有被编译,但是Linux源代码树仍然包括对a.out“ em86”,“ flat”和“ elf_fdpic”格式以及普通ELF的内在支持。除了em86以外,所有这些似乎都是本机二进制可执行文件格式;没有足够的信息让我知道何时使用“ flat”或“ elf_fdpic”。em86似乎是一种运行特定x86模拟器的pre-binfmt_misc机制,它可能仍然存在,以便向后兼容。
zwol 2015年

2
在Debian Linux的(我没有检查RedHat和其他人)的命令显示所有当前binfmt项是update-binfmts --display
魔像
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.