すべての Linux ポート (つまり、異なるプロセッサ上の Linux カーネル) は、実行可能ファイルとライブラリのファイル形式として ELF を使用します。特定の ELF バイナリは、それを実行できる単一のアーキテクチャ/OS でラベル付けされています (ただし、一部の OS は、他の OS から ELF バイナリを実行する互換性があります)。
ほとんどのポートは古い a.out フォーマットをサポートしています。 (一部のプロセッサは十分に新しいため、それらの a.out 実行可能ファイルは存在しません。)
一部のポートは、他の実行可能ファイル形式もサポートしています。たとえば、PA-RISC ポートは HP-UX の古い SOM 実行可能ファイルをサポートしており、μcLinux (nonmmu) ポートは独自の FLAT フォーマットをサポートしています。
Linux にも binfmt_misc
があります 、これにより、ユーザー空間は任意のバイナリ形式のハンドラーを登録できます。一部のディストリビューションは、これを利用して Windows、.NET、または Java アプリケーションを実行できるようにしています。実際にはまだインタープリターを起動していますが、ユーザーには完全に透過的です。
Linux on Alpha は、em86
経由で実行される Intel バイナリのロードをサポートしています。 エミュレータです。
binfmt_misc
登録可能 他のアーキテクチャの実行可能ファイルの場合、qemu-user で実行します。
理論的には、ファット バイナリ用に新しいフォーマットを作成することもできます。おそらく ELF に新しい「アーキテクチャ」を登録することもできます。次に、カーネル binfmt
ローダーはこの新しい形式について教えられる必要があり、ld-linux.so
を見逃すことはできません。 動的リンカーとビルド ツールチェーン全体。このような機能にはほとんど関心がなく、私の知る限り、そのような機能に取り組んでいる人は誰もいません.
すべての Linux ディストリビューションは同じバイナリ形式の ELF を使用しますが、いくつかの違いがあります:
<オール>そのため、プログラムをすべてのディストリビューションで実行したい場合は、カーネルの syscall のみに依存するバージョンを静的にリンクする必要がある場合があります。これでも、指定されたアーキテクチャしか実行できません。
本当に任意のアーチでプログラムを実行したい場合は、すべてのアーチのバイナリをコンパイルし、シェル スクリプトを使用して適切なアーチを起動する必要があります。
ほぼすべての Linux プログラム ファイルが ELF 標準を使用しています。