ディストリビューション間で実行可能なバイナリファイルに違いはありますか?
質問
すべてのLinuxディストリビューションは同じカーネルを使用するため、実行可能バイナリファイルに違いはありますか?
はいの場合、主な違いは何ですか?それとも、ユニバーサルLinux実行可能ファイルをビルドできるということですか?
解決
すべてのLinuxディストリビューションは同じバイナリ形式のELFを使用しますが、まだいくつかの違いがあります:
- 異なるCPUアーチは異なる命令セットを使用します。
- 同じCPUアーキテクチャが異なるABIを使用する場合があります。ABIは、レジスタファイルの使用方法、ルーチンの呼び出し/戻り方法を定義します。異なるABIは一緒に動作できません。
- 同じアーチ、同じABIであっても、ディストリビューション内の1つのバイナリファイルを別のバイナリファイルにコピーできるという意味ではありません。ほとんどのバイナリファイルは静的にリンクされていないため、ディストリビューションのライブラリに依存します。つまり、ディストリビューションごとにバージョンやライブラリのコンパイル構成が異なる場合があります。
したがって、すべてのディストリビューションでプログラムを実行する場合は、カーネルのシステムコールのみに依存するバージョンを静的にリンクする必要があります。これでも、指定されたアーチのみを実行できます。
任意のアーチでプログラムを本当に実行したい場合は、すべてのアーチのバイナリをコンパイルし、シェルスクリプトを使用して適切なものを起動する必要があります。
他のヒント
すべての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アプリケーションを実行できます。インタープリターは実際にはまだ起動していますが、ユーザーには完全に透過的です。
Alpha上のLinuxは、Intelバイナリのロードをサポートしており、 em86
エミュレータを介して実行されます。
binfmt_misc
を他のアーキテクチャの実行可能ファイルに登録し、 qemu-で実行することができます。ユーザー。
理論的には、新しいフォーマットを作成できます。おそらく、新しい「アーキテクチャ」を登録します。 ELF-ファットバイナリ用。次に、カーネルの binfmt
ローダーにこの新しい形式について教える必要があります。 ld-linux.so
動的リンカーとビルド全体を見逃したくないでしょう。ツールチェーン。そのような機能にはほとんど関心がありませんでしたが、私が知る限り、このような機能に取り組んでいる人はいません。
ほとんどすべてのLinuxプログラムファイルは、 ELF 標準を使用します。
古いUnixも COFF 形式を使用していました。あなたはまだこの形式で昔の実行可能ファイルを見つけるかもしれません。 Linuxはまだサポートしています(ただし、現在のディストリビューションでコンパイルされているかどうかはわかりません)。
すべてのLinuxディストリビューションを実行するプログラムを作成する場合は、スクリプト言語( Python
や Perl
など)の使用を検討できます。または Java などのプラットフォームに依存しないプログラミング言語。
スクリプト言語で記述されたプログラムは実行時にコンパイルされます。つまり、実行されるプラットフォームに合わせて常にコンパイルされるため、常に動作するはずです(ライブラリが適切に設定されている場合)。
一方、Java で記述されたプログラムは、配布する前にコンパイルされますが、Java VMがインストールされている限り、どのLinuxディストリビューションでも実行できます。
さらに、 Java
で書かれたプログラムは、 MS Windows
や Mac OS
などの他のオペレーティングシステムで実行できます。
Python
および Perl
で書かれた多くのプログラムにも同じことが言えます。ただし、 Python
または Perl
プログラムが別のオペレーティングシステムで動作するかどうかは、そのプログラムで使用されるライブラリと、これらのライブラリが他のオペレーティングシステムで使用できるかどうかによって異なります。