26

gcc のビルド手順に従って、gcc (および gmp、mpc など) のビルドと同時に binutils をビルドできます。

そのページの内容は次のとおりです。

また、binutils をビルドする場合 (既存のインストールをアップグレードするため、または OS の対応するツールの代わりに使用するため)、binutils ディストリビューションを同じディレクトリまたは別のディレクトリに展開します。後者の場合、コンパイラと一緒にビルドする予定の binutils のコンポーネント (bfd、binutils、gas、gprof、ld、opcodes など) へのシンボリック リンクを、GCC ソースを含むディレクトリに追加します。

同様に、GMP、MPFR、および MPC ライブラリは、GCC と一緒に自動的に構築できます。GCC ソースを含むディレクトリで GMP、MPFR、MPC ソース配布を展開し、それらのディレクトリの名前をそれぞれ gmp、mpfr、mpc に変更します (または同じ名前のシンボリック リンクを使用します)。

これは gmp、mpc、mpfr では問題なく動作しますが、binutils のすべてをビルドすることはできないようです。また、binutils から新しいゴールド リンカーをビルドする方法もわかりません。問題のバージョンは gcc-4.4.2 と binutils-2.20 です。

ステップバイステップの説明は素晴らしいことです(私にとっても、この問題に遭遇した他の人にとっても)。

4

2 に答える 2

28

クロスコンパイラの構築に一般的に使用されているため、これはまだサポートされているはずです。

実際、gcc 4.6.0 と binutils 2.21 (適切なバージョンの gmp、mpc、および mpfr を使用) でこれを行ったところ、次のように動作するように見えました。

  • ビルドしようとしているもののすべてのアーカイブ (gcc-4.6.0.tar.bz2、binutils-2.21.tar.bz2 など) を新しいディレクトリに取得します。src
  • このディレクトリでそれらをすべて un-tar すると、gcc-4.6.0/ binutils-2.21/ gmp-5.0.2/互いに並んで座っていることになります

    tar jxvf gcc-4.6.0.tar.bz2
    ... (unpack others here, watch file lists scroll past)
    
  • cd gcc-4.6.0リンクにバージョン番号を付けずに、gmp、mpc、および mpfr ディレクトリをシンボリック リンクします。

    ln -s ../gmp-5.0.2 gmp
    
  • ここで、gcc ディレクトリに存在しない binutils ディレクトリからすべてをシンボリック リンクします。したがって、既に存在するものはすべて優先されますが、binutils ツールはビルドに表示されます。

    for file in ../binutils-2.21/* ; do ln -s "${file}" ; done
    
  • ディレクトリを変更し、ビルド ディレクトリを作成して、これらすべてをソースとは別にビルドします (これは常に推奨される方法であり、ソース ディレクトリ内でビルドするよりも信頼性が高くなる傾向があります)。

    cd .. ; mkdir build
    
  • この時点で、次のような一連のディレクトリとリンクが作成されているはずです。

    binutils-2.21/
    build/
    gcc-4.6.0/
       gmp -> ../gmp-5.0.2
       mpc -> ../mpc-0.9
       mpfr -> ../mpfr-3.0.1
       bfd -> ../binutils-2.21/bfd
       binutils -> ../binutils-2.21/binutils
       gas -> ../binutils-2.21/gas
       ... (lots more symlinks for binutils here, plus existing gcc stuff)
    gmp-5.0.2/
    mpc-0.9/
    mpfr-3.0.1/
    
  • 構成するために渡す必要があるオプションを使用して、このディレクトリからすべてを構成します。

    ../gcc-4.6.0/configure --prefix=/foo/bar --enable-languages=c,c++,ada
    
  • ビルド、待機、インストール (make -j4しばらく時間がかかるため、いくつかのビルドを並行して取得するには、おそらくここで or so を使用することをお勧めします):

    make -j4 ; make install
    

宛先がまだパスにない場合はパスに追加します (ステップ/etc/ld.so.conf中にライブラリをインストールすることに関するメッセージに記載されているように、これが で指定されたものの外にある場合は、おそらく LD_LIBRARY_PATH への lib dir を追加します)。make installバージョン。

新しいシェルを開いたら、このインストール済みバージョンを使用していることを確認する価値があるでしょう。

    `which gcc`

    `which as`

..また、バージョンが期待どおりであることも次のとおりです。

    `gcc --version`

    `as --version`

..(もちろん)コードベースで解放する前に、インストールされたバージョンがいくつかの簡単な例で実行可能ファイルを正常にビルドすることをテストします:)

編集: 以下のコメントには、一緒に動作することが知られているいくつかのバージョンのセットが含まれています。すべての組み合わせが機能するわけではないため、記載されている組み合わせとは異なる組み合わせについて試行錯誤する必要がある場合があります。

かなり後の編集: gdb もこのビルドに含めることができます (ここでも互換性のあるコンポーネントのバージョンが必要です - コメントを参照してください)。これを binutils の後に同様の方法で追加するfor f in ../gdb-8.1.1/* ; do ln -s "${f}" ; doneと、ビルドが自動的に取得します。

于 2011-06-03T14:44:55.330 に答える
4

やりたいことは、「結合ツリー」または「ツリー内の binutils」ビルドと呼ばれます。続行する方法に関するドキュメントは、あちこちあります。

于 2010-03-10T15:38:07.947 に答える