Linux 如何确定使用哪些工具来运行(非文本)二进制文件?

gol*_*lem 23 linux executable

我知道 Linux 使用 shebang 行来确定用于脚本语言的解释器,但它如何用于二进制文件?

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

Linux 如何确定给定的二进制文件必须作为 Linux 本机二进制文件、Windows 本机二进制文件(使用wine工具)还是作为 Windows .NET 二进制文件(使用单声道工具)运行?

Cel*_*ada 29

总之:binfmt_misc。它是一个特定于 Linux 的、不可移植的工具。

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

其他所有内容都必须通过 binfmt_misc 系统注册。该系统允许您向内核注册一个基于幻数的简单模式检查,以及相应的解释器。

  • 尽管 OP 明确要求使用 Linux,但值得注意的是,与可在 Linux 和其他类 Unix 系统上运行的许多其他解决方案不同,这个解决方案完全特定于 Linux。 (6认同)
  • 它可能不会被编译,但 Linux 源代码树仍然包含对 `a.out`、“em86”、“flat”和“elf_fdpic”格式以及普通 ELF 的内在支持。除了 em86 之外,所有这些似乎都是本机二进制可执行格式;没有足够的信息让我弄清楚何时使用“flat”或“elf_fdpic”。em86 似乎是用于运行特定 x86 模拟器的 pre-binfmt\_misc 机制,它可能只是为了向后兼容而存在。 (6认同)
  • 在 Debian Linux(我没有检查 RedHat 和其他)上,显示所有当前 binfmt 条目的命令是 `update-binfmts --display` (2认同)