Linuxは(非テキスト)バイナリの実行に使用する機能をどのように決定しますか?


23

Linuxはシェバン行を使用してスクリプト言語に使用するインタープリターを決定することを理解していますが、バイナリに対してはどのように機能しますか?

つまり、Linuxバイナリを実行でき、winemono、Windowsネイティブと.NETバイナリの両方をインストールしたということです。そして、それらのすべてについて、それ./binary-nameを実行するのは(PATHにない場合)ただです。

Linuxは、特定のバイナリをLinuxネイティブバイナリ、Windowsネイティブバイナリ(ワイン機能を使用)、またはWindows .NETバイナリ(モノ機能を使用)として実行する必要があるとどのように判断しますか?

回答:


29

一言で言えば、binfmt_miscです。これは、Linux固有のポータブルではない機能です。

組み込みロジックを備えたカーネルによって認識される形式がいくつかあります。つまり、これらはELF形式(通常のバイナリ用)とシバン規則(スクリプト用)です。(答えの次の部分については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

2
DebianのLinuxの(私はRedHatのと他人をチェックしませんでした)現在のすべてのbinfmtエントリを表示するためのコマンドがあるオンupdate-binfmts --display
ゴーレム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.