Glibc の"閉じ込め"

それでは暫定的な C ライブラリがインストールされたので、この章の最後でインストールされる全てのツールをこれらのライブラリに対してリンクさせます。 これを行うのに、リンカとコンパイラのスペックファイルを調整する必要があります。

まず、binutils-build ディレクトリで、次のように実行して、調整したリンカをインストールします。

make -C ld install

リンカはすこし前の、Binutils の第 1 段階の終りに調整されました。 この時点から先では全てが /tools/lib の中のライブラリに対してのみリンクされます。

Note: もし何かの理由で、第 1 段階での Binutils のソースと構築ディレクトリを残しておくという以前の警告を見逃してしまったり、誤って消してしまったり、アクセスできなくなってしまっていたりしても心配はいりません。 すべてがなくなってしまったわけではありません。上のコマンドを無視して下さい。 その結果として引き続くプログラムの作成時に、ホストにあるライブラリに対してリンクがなされる多少の可能性が出てくるだけです。 これは理想的ではありませんが、しかし大きな問題でもありません。この後続いて第 2 段階の Binutils をインストールしたときに状況は改善されます。

さてそれでは調整されたリンカがインストールされたので、Binutils の構築とソースディレクトリを削除しなければいけません。

次にする事は GCC スペックファイルが新しい動的リンカを指し示すように修正することです。簡単な sed がこれを行います。

SPECFILE=/tools/lib/gcc-lib/*/*/specs &&
sed -e 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' \
    $SPECFILE > tempspecfile &&
mv -f tempspecfile $SPECFILE &&
unset SPECFILE

上の記述をすべて手で入力するよりは、むしろカットアンドペーストすることをお勧めします。 または、そうしたければスペックファイルを編集することもでき、"/lib/ld-linux.so.2" の部分をすべて "/tools/lib/ld-linux.so.2" で置き換えるだけです。

Important: もしプラットフォーム上の ld-linux.so.2 と名前の異なる何か別の動的リンカを使っているなら、上のコマンドで ld-linux.so.2 の代わりにお使いの動的リンカを指定しなけれいけません。 必要ならば the Section called Toolchain 技術情報という名前の節を再び参照して下さい。

最後に、ホストシステムに由来するインクルードファイルのいくつかが、GCC のプライベートインクルードディレクトリに見つかる可能性があります。 これは GCC の構築の一部として実行される "fixincludes" プロセスの為に起こります。この章でこのことについてもう少し説明します。 さしあたり今はこの可能性を消すために以下のコマンドを実行して下さい。

rm -f /tools/lib/gcc-lib/*/*/include/{pthread.h,bits/sigthread.h}

Caution

ここで立ち止まって、新しい toolchain の基本的な機能(コンパイルとリンク)が期待通り動いていることを確認するのは必須事項です。 これを行なうために私達は簡単な完成度テストを行ないます。

echo 'main(){}' > dummy.c
gcc dummy.c
readelf -l a.out | grep ': /tools'

すべてが正しく動いているなら、エラーはないはずで、最後のコマンドの出力結果は次のようになります。

[Requesting program interpreter: /tools/lib/ld-linux.so.2]

上に示したような出力結果がでない、あるいは出力結果がない場合、何か重大な間違いがあります。 どこに問題があるかを見つけだし、修正するために、これまでやったことを振り返ってみなければいけません。 これが完了するまでは続けても意味がありません。特に、/tools/lib がお使いの動的リンカのプリフィックスとなっていることを注意しましょう。 もちろん、あなたが ld-linux.so.2 とは何か別の名前の動的リンカを使ったプラットフォーム上で作業しているなら、結果の出力は少し異なったものになるでしょう。

すべてが問題ないとわかったなら、テストファイルを削除します。

rm dummy.c a.out

これで独立した toolchain のインストールは完了で、残りの暫定的なツールを構築するのに使うことができるようになりました。