バイナリは異なるCPUアーキテクチャ間で移植可能ですか?

バイナリは異なるCPUアーキテクチャ間で移植可能ですか?

私の目標は、組み込みLinux用に開発することです。私はARMを使用したベアメタル組み込みシステムの経験があります。

さまざまなCPUターゲットの開発に関するいくつかの一般的な質問があります。私の質問は次のとおりです。

  1. 「のようにコンパイルされたアプリケーションがある場合x86ターゲット、Linuxオペレーティングシステムのバージョンxyz「他のシステムで同じコンパイルされたバイナリを実行できます」ARMターゲット、Linuxオペレーティングシステムバージョンxyz'?

  2. 上記が真でない場合の唯一の方法は、関連するツールチェーン「arm-linux-gnueabi」を使用してアプリケーションソースコードを再構築/再コンパイルすることです。

  3. 同様に、私にx86ターゲット、Linuxオペレーティングシステムのバージョンxyz「他のシステムで同じコンパイルされた.koをロード/使用できます。」ARMターゲット、Linuxオペレーティングシステムバージョンxyz'?

  4. 上記が真でない場合、唯一の方法は、関連するツールチェーン「例:arm-linux-gnueabi」を使用してドライバソースコードを再構築/再コンパイルすることです。

ベストアンサー1

カント。バイナリはターゲットアーキテクチャに対して(再)コンパイルする必要があり、Linuxは同様の機能を提供しません。太ったバイナリ箱の外。その理由は、コードが特定のアーキテクチャ用の機械語コードにコンパイルされ、機械語コードがほとんどのプロセッサフ​​ァミリで非常に異なるためです(例:ARMとx86は非常に異なります)。

編集:一部のアーキテクチャは、64ビットCPUで以前のバージョンとの互換性レベル(まれに他のアーキテクチャとの互換性)を提供することに注意する価値があります。 32ビットバージョンと以前のバージョンとの互換性が一般的です(ただし、覚えておいてください:依存ライブラリ)C標準ライブラリを含む32ビットでなければなりません。静的リンク)。また言及する価値があります。アイテニアム、x86コード(32ビットのみ)を実行できますが、x86コードの実行速度が遅いことが少なくとも市場で成功しなかった理由の1つです。

互換モードでも、以前のCPUでは最新の命令でコンパイルされたバイナリは使用できません(32ビットバイナリではAVXを使用できません)。ネハレムx86プロセッサ; CPUはこれをサポートしていません。

カーネルモジュールは、関連するアーキテクチャに合わせてコンパイルする必要があります。さらに、32ビットカーネルモジュールは64ビットカーネルで実行できず、その逆も同様です。

クロスコンパイルバイナリに関する情報(ターゲットARMデバイスにツールチェーンは必要ありません)については、以下のgrochmalの包括的な答えを参照してください。

おすすめ記事