1

OSX Lion でホストされ、i386-pc-solaris2.10 と x86_64-linux-gnu の両方をターゲットとするクロス gcc コンパイラをいくつか構築することに成功しました。PATH の $BINUTILSROOT および $BINUTILSROOT/bin の下に、これらのターゲット用に 2.22 の binutils がインストールされています。特にhttp://gcc.gnu.org/install/configure.htmlを読む

--with-as=pathname アセンブラーを見つけるための標準規則によって検出されたものではなく、パス名が指すアセンブラーをコンパイラーが使用する必要があることを指定します。

  • GCC がクロス コンパイラでビルドされていない場合は、libexec/gcc/target/version ディレクトリを確認してください。libexec のデフォルトは exec-prefix/libexec です。exec-prefix のデフォルトは prefix であり、上記の --prefix=pathname スイッチで上書きされない限り、デフォルトは /usr/local です。target は「sparc-sun-solaris2.7」などのターゲット システムのトリプルで、version は 3.0 などの GCC バージョンを示します。
  • ターゲット システムがビルドしているシステムと同じ場合は、オペレーティング システム固有のディレクトリ (Sun Solaris 2 の /usr/ccs/bin など) を確認してください。
  • 名前の先頭にターゲット システムのトリプルが付いているツールの PATH をチェックインします。
  • ホストとターゲット システムのトリプルが同じ場合 (つまり、ホスト ツールがターゲットにも使用できる場合はホスト ツールを使用します)、名前の先頭にターゲット システムのトリプルが付加されていないツールの PATH をチェックインします。

-gcc ( --with-gnu-as --with-gnu-ld で構成) はそれぞれ i386-pc-solaris2.10-as と x86_64-linux-gnu-as (および対応する -ld ) PATH にある $BINUTILSROOT/bin にあるため、上記のリストの 3 番目の箇条書きが適用されます。しかし、これはうまくいかないようで、dtrace で -gcc が PATH で -as と -ld を検索しないことを確認しました。私が見つけた唯一の解決策は、 as と ld を追加することも完全に指定することです

--with-as=$BINUTILSROOT/bin/-as --with-ld=$BINUTILSROOT/bin/-ld

gcc を構成するとき。

gcc ドキュメントを誤解していますか、それともクロスコンパイルを機能させる唯一の方法ですか?

4

1 に答える 1

1

通常、cross-binutils と同じディレクトリにクロスコンパイラをインストールします。そうすれば、ただうまくいくでしょう。

パッケージをビルドするためにコンパイラを「ステージング」するためにコンパイラを同じディレクトリにインストールしない場合は--prefix、最終的にインストールされた場所 (binutils が既に存在している必要があります)を使用して構成し、インストールする必要があります。と

make DESTDIR=/path/to/staging/dir install

プレフィックス設定をオーバーライドします。次に、それらのファイルを使用する前に、それらのファイルを (おそらくパッケージ インストールの一部として) 真のプレフィックスにコピーします。

別の理由で同じディレクトリにインストールしたくない場合は、発見したパスを指定する必要があります。それを機能させる方法は他にもありますが、 --with-as が意図した解決策です。そのソリューションが本当に気に入らない場合は、次のことができます

make configure-gcc
ln -s $BINUTILSROOT/bin/as gcc/as
ln -s $BINUTILSROOT/bin/ld gcc/ld

これでビルドは機能しますが (IIRC)、最終的にインストールされたコンパイラは依然として標準の場所を参照します。実際、ビルド中のみ gcc ディレクトリ標準的な場所の 1 つであるため、これは機能します。

このすべての理由は、「x86_64-linux-gnu-as」を使用していないためです。実際には「prefix/x86_64-linux-gnu/bin/as」を使用し、それが存在しない場合は他のものを探します通常、ホスト "/usr/bin/as" が検出されますが、これはうまく機能しません (非常に紛らわしいエラー メッセージが表示されます)。

于 2012-04-16T12:47:32.243 に答える