9

私が読んだすべてのことは、クロスコンパイラを構築することは、それが実行されるプラットフォームを対象とするコンパイラを構築することよりもはるかに難しいことを暗示しているようです. これは本当ですか?もしそうなら、なぜですか?任意のプラットフォーム用のアセンブリ コードとシステム コールを生成することは、コンパイラが実行されているプラ​​ットフォーム用のそのようなコードとシステム コールを生成することよりも難しくないように思えますが、おそらく私は素朴です。

4

7 に答える 7

3

これは難しいことではありませんが、コンパイラのアーキテクチャに依存する可能性があります。

コンパイラは、ソースコードをasmおよびシステムコールに変換するだけではありません。また、既存のヘルパーコードを生成されたファイルに統合しています。これは、スタートアップコード、関数のプリアンブル、インライン化できるCapiの一部などを含むコードです。

プラットフォームA上に構築されたプラットフォームA用の通常のコンパイラC1では、元のコンパイラC0はC1とそのヘルパーコード(C0はAを対象としているため、A用)を直接ビルドできます。

プラットフォームA上に構築されたプラットフォームB用のクロスコンパイラC2では、元のコンパイラC0は最初にヘルパーコードを必要としない特別なバージョンのC2を構築する必要があります(ヘルパーコードはB用であり、C0はAを対象としているため)。ヘルパーコードを生成するには、C2を実行する必要があります。コンパイラーによっては、ヘルパーコードを含むC2の2番目のバージョンを生成する必要がある場合があります。

ヘルパーコードなしで限定バージョンのC2を構築するという行為は、ブートストラップです。

于 2009-02-17T17:52:11.237 に答える
3

以下は、GCC クロスコンパイルでの作業で遭遇した問題の一部です。

  • リンクするには、ターゲット システムのシステム ファイルの一部がホスト システム (つまり、sysroot) に存在する必要があります。

  • 一部の言語では、実行時ではなくコンパイル時に評価する必要があります。さらに、一部の最適化では、(最適化されていない場合) 実行時に評価されるものをコンパイル時に評価します。ターゲットにホスト システムに存在しない数値型がある場合、コンパイル時と実行時のケースで同じ答えを得るのが難しい場合があります。

  • テストは、もう少し煩わしい場合があります。2 つのシステムと、一方から他方へプログラムを転送する方法が必要です。

とはいえ、実際に私が遭遇した一般的な問題については、これで終わりです。

于 2009-08-05T19:26:26.573 に答える
2

「クロスコンパイラーの構築は、それが実行されているプラ​​ットフォームをターゲットとするコンパイラーを構築するよりもはるかに困難です。」

この問題は、ライブラリの構築方法とアクセス方法が原因で発生します。

通常の状況では、すべてのライブラリは特定の場所にあり、そのシステム上のすべてのアプリによって使用されます。すべてのビルドメカニズムとソフトウェアは、ライブラリの場所を想定しています。makeファイル、コンパイラなどは、特定の場所に移動して必要なものを見つけることができるという考えに依存しています。

ただし、クロスコンパイルの場合、クロスコンパイラ、makeファイルなどは、これらの仮定を行うことはできません。そうすると、間違ったライブラリがリンクされます。

つまり、開発者が早い段階で特定の仮定を立てたという事実に帰着し、私たちはそれに固執しています。

UNIXは1つのルートファイルシステムしか知らないため、ルートファイルシステムを構築する場合はさらに難しくなります。別のルートファイルシステムを構築するときは、実際のルートファイルシステムに影響を与えることなくそれを操作できる特別な環境を作成する必要があります。

-アダム

于 2009-02-17T17:55:53.457 に答える
1

「クロスコンパイラとしてのGCCの構築」のような特定のケースを見ている可能性はありますか?「構築」は「書き込み」ではなく「コンパイル」を意味しますか?

ライブラリを取り巻く問題のため、これは難しいかもしれません。クロスコンパイラの場合、ターゲットプラットフォーム用のライブラリが必要です。「ネイティブ」(つまり非クロス)コンパイラの場合、明らかにすでにターゲットライブラリがあります。

私は、「コードジェネレーターの作成」の側面が同じであるか、少なくともコンパイラーが実行される場所よりもターゲットプロセッサーのアーキテクチャーの影響を強く受けることについてあなたと一緒にいます。

そして、クロスコンパイラが非クロスコンパイラよりもはるかに簡単であるという明らかな状況があります。8051でホストされているC++コンパイラは、ターゲットとするプラットフォームに関係なく、大変な作業になると思います。

于 2009-02-17T17:50:00.540 に答える
1

多くのクロスコンパイラには複数のターゲットがあります。一般に、マルチターゲットコンパイラは、シングルターゲットコンパイラよりもはるかに難しいと思います。すべてのマルチターゲットコンパイラは、定義上、クロスコンパイラです。したがって、多くのクロスコンパイラは、非クロスコンパイラよりもはるかに複雑です。

プラットフォームB専用のコードをコンパイルするプラットフォームAでコンパイラを作成することは、原則として、プラットフォームA専用でコンパイルするプラットフォームAでコンパイラを作成することよりも難しいことではありません。

于 2009-02-17T17:55:05.003 に答える
1

クロスコンパイラを構築するのは、クロスコンパイルをしたいと思わない場合にのみ困難です。興味深いことに、アセンブラ、リンカ、デバッガについても同じことが言えます。必要なのは、ターゲット マシンについて知っていることを表す明示的な抽象化を作成することを忘れないことです。

非常によく設計され、よく文書化されたクロスコンパイラの例については、 lccをチェックしてください。クロスデバッガーの設計について読むには、会議論文博士論文があります。コードはダウンロード可能です。わからない。

于 2009-02-20T05:01:00.003 に答える
0

次の質問に対するこの回答は、これが難しい理由を理解するのに役立つ場合があります。

最近、クロスプラットフォームのプログラムを作成できないのはなぜですか?

すべては、さまざまな方法でネイティブIOを呼び出すさまざまなオペレーティングシステムに帰着すると思います。プラットフォームに依存しないコンパイラを構築するには、すべての核心がどのように機能するかを正確に理解し、基本的にOSを構築する必要があります。

[今は仕事を辞めなければならないので、家に帰ったら更新します]

于 2009-02-17T17:54:35.490 に答える