0

基本的に小さなARMコンピューターであるRaspberry Pi用にクロスコンパイルするつもりです。ホストは、Arch Linux を実行する i686 ボックスになります。

私の最初の直感は、Arch Linux が提供するクロス コンパイラ、arm-elf-gcc-base および arm-elf-binutils を使用することです。ただし、私が読んだすべてのウィキと投稿は、カスタム gcc ビルドのいくつかのバージョンを使用しているようです。彼らは、独自の gcc の作成にかなりの時間を費やしているようです。問題は、gcc を別の gcc よりも使用することが重要である理由を彼らが決して言わないことです。

  1. ストック ディストリビューションが提供するクロス コンパイラを、一般的なカーネルやアプリで Raspberry Pi または ARM をビルドするために使用できますか?

  2. ARM アーキテクチャには複数のコンパイラが必要ですか? もしそうなら、なぜ、単一の gcc がすべての x86 バリアントをサポートできるのでしょうか?

  3. 2) の場合、特定のバージョンの gcc でサポートされているターゲット サブセットをどのように推測できますか?

  4. より一般的な質問ですが、カスタム gcc ビルドを必要とする一般的なユース ケースは何ですか?

できる限り技術的にお願いします。理由と方法を知りたいです。

4

1 に答える 1

2

開発者が自分の(ホスト)とは異なるマシン(ターゲット)用のソフトウェアの構築(クロスコンパイル)について話すとき、彼らはtoolchainバイナリファイルを構築するために必要なツールのセットを説明するためにこの用語を使用します。これは、実行可能バイナリをビルドする必要がある場合、コンパイラ以上のものが必要になるためです。

オペレーティングシステムと標準ライブラリの要件に従ってランタイムを初期化するには、ルーチン(crt0.o )が必要です。ライブラリの標準セットが必要であり、システムコールAPIといくつかのOSレベル構成(feページサイズ)およびデータ構造(fe時間構造)のため、これらのライブラリはターゲット上のカーネルを認識する必要があります。

ハードウェア側では、ARMアーキテクチャのさまざまなセットがあります。アーキテクチャには下位互換性がありますが、ツールチェーンは本質的にバイナリであり、特定のアーキテクチャを対象としています。デフォルトで最も普及しているアーキテクチャを使用できますが、それはすでに制約のある環境(組み込みデバイス)にはあまり効果的ではありません。最新のアーキテクチャを使用している場合は、古いアーキテクチャベースのターゲットには役立ちません。

ホストのホストでバイナリをビルドすると、コンパイラは独自の環境から必要なすべてのビットを検索したり、ホストにあるものを使用したりできます。そのため、上記の詳細のほとんどは開発者には見えません。ただし、ホストタイプとは異なるターゲット用にビルドする場合、ツールチェーンはハードウェア、OS、および標準ライブラリの詳細を認識している必要があります。これらをツールチェーンに伝える方法は...ある程度のブートストラップを必要とする可能性のある詳細に従ってツールチェーンを構築することです。(または、ツールチェーンがサポート/構築されている場合は、広範なパラメーターのセットを介してこれを行うことができます。)

したがって、汎用(ストック)クロスコンパイルツールチェーンがある場合、すでにいくつかのターゲットの詳細が設定されており、要件を満たしていない可能性があります。例については、Ubuntuの状況に関するこの最近の質問を参照してください。

于 2012-10-30T21:39:47.283 に答える