Toolchain を再調整する

さて新しい C ライブラリがインストールされたので toolchain を再調整します。 新しくコンパイルされたプログラムは、すべて新しい C ライブラリに対してリンクされるよう調整します。 基本的にこれは前の章の "閉じ込め" 段階でやったことの逆です。

まず初めにリンカを調整します。このために Binutils の第 2 段階でソースと構築ディレクトリを残しておきました。 binutils-build ディレクトリの中で以下のコマンドを実行して、調整されたリンカをインストールします。

make -C ld INSTALL=/tools/bin/install install

Note: もし何かの理由で、第 5 章の第 2 段階での Binutils のソースと構築ディレクトリを残しておくという以前の警告を見逃してしまったり、誤って消してしまったり、アクセスできなくなってしまっていたりしても心配はいりません。 すべてがなくなってしまったわけではありません。上のコマンドを無視して下さい。これは次のパッケージである Binutils が /usr ではなく /tools にある Glibc ライブラリに対してリンクされるという結果になります。 これは理想的ではありませんが、テストでは結果としてできる Binutils プログラムのバイナリ類は同一になるはずだということをを示しています。

これからすべてのコンパイルされたプログラムが /usr/lib/lib にあるライブラリに対してのみリンクされます。 第 2 段階で作られる Makefile は /usr/bin/install への参照をまだ含んでいるので、INSTALL=/tools/bin/install が別に必要とされます。 あるホストディストリビューションは Makefile に、優先する ginstall シンボリックリンクを持っているので、ここで問題を引き起こします。 上のコマンドはこれもまた対処します。

これで、Binutils のソースと構築ディレクトリを削除することができます。

次に行うのは GCC スペックファイルが新しい動的リンカを示すように修正することです。ちょうど以前にやったように、これを行うのに、sed を使います。

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

再度、上述のコマンドコマンドはカットアンドペーストがお勧めです。そして以前のように、意図された変更が実際に行われたことを確認するため、スペックファイルを調べるというのはよいことです。

Important: 動的リンカの名前が ld-linux.so.2 とは何か異なるプラットフォーム上で作業をしているなら、上のコマンドでお使いのプラットフォームの動的リンカの名前を ld-linux.so.2 の代わりに用いましょう。 必要ならばthe Section called Toolchain 技術情報 in Chapter 5という節を参照してください。

Caution

この段階で、調整された toolchain の基本的な機能(コンパイルとリンク)が期待通り動いていることを確認するのは必須事項です。このための簡単な完成度チェックを行ないます。

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

すべてがうまく行っているのなら、エラーはないはずで、結果の出力は以下のようになるはずです。

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

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

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

rm dummy.c a.out