[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.4.4 ‘libgcc.a’ とクロスコンパイラ

GNU CC でコンパイルしたコードは、決まった実行時サポート関数を 暗黙に使う。このうちの幾つかの関数は、GNU CC 自身で問題なく コンパイルできるのだが、幾つかできないものがある。 問題となる関数はソースファイル ‘libgcc1.c’ にあるものである。 このファイルから作られるライブラリは ‘libgcc1.a’ と呼ばれる。

ネイティブコンパイラを構築するときは、これらの関数は 何か他のコンパイラでコンパイルされる。そのコンパイラとは GNU CC をブートストラップするのに使っているものである。 おそらく、そのコンパイラは、これらの演算を開かれたコードで書く方法を 知っているだろうし、あるいは、その機種に付いてくるはずの実行時の エミュレーション機能を呼び出す方法を知っているだろう。 だが、この方法はクロスコンパイラを構築する場合には使えない。 構築に使うコンパイラはホストシステムについては知っているが、 ターゲットシステムのことは知らないからである。

このため、クロスコンパイラを構築する際には、 期待される仕事を行なう適切なライブラリ ‘libgcc1.a’ を用意する 必要がある。

libgcc1.c’ をクロスコンパイラ自体でコンパイルするのはうまく いかない。このファイルにある関数群は、GNU CC が読者のターゲット機種用には どうやって開かれた形でコードを書けば良いか知らないような算術演算を 実装するものであると想定されている。これらの関数を GNU CC 自体で コンパイルしたなら、無限に再帰的なコンパイルになってしまう。

任意の与えられたターゲットで、これらの関数のほとんどは必要ではない。 GNU CC が、算術演算を開いたコードに書けるなら、これらの関数を 呼び出さない。読者のターゲット機種で、これらの関数を一切必要と しないというのも可能である。その場合は、‘libgcc1.a’ として 空のライブラリを与えれば良い。

多くのターゲットでは、サポートが必要なライブラリは、 乗算と除算用のもののみである。乗算と除算を行う関数を含むライブラリと リンクするのなら、MULSI3_LIBCALL 等のマクロを定義することで、 GNU CC に直接呼出しを行わせることが可能である。これらのマクロは、 ターゲット記述マクロファイルで定義する必要がある。 幾つかのターゲットについては、既に定義済みである。 これで libgcc1.a を不要とするのには充分である可能性がある。 もしそうなら、空のライブラリを指定することが可能である。

ターゲットによっては、浮動小数点命令がないものがある。これらの 機種では ‘libgcc1.a’ 内の別の関数が必要になる。それは、浮動小数点 算術演算を行うものだえる。GNU CC の最近のバージョンには、 浮動小数点演算をエミュレートするファイルが含まれている。 ある程度作業を行えば、‘libgcc1.a’ として使える浮動小数点 エミュレータを作り上げることが出来るはずである。 おそらく、将来のバージョンでは、この作業を自動的に簡単に行う コードが入るだろう。入るかどうかは、実装したいという人が誰かいるか どうかに依る。

組み込みターゲットの中には、 ‘libgcc1.a’ の 必要な全てのルーチンを C またはアセンブラで書いたものが付いてくる ものがある。 これらのターゲットでは、‘libgcc1.a’ を自動的に構築するので、 読者は何も特別なことをする必要がない。その他の組み込みターゲットは、 なんら ‘libgcc1.a’ を必要としない。なぜなら、必要な演算は全て ハードウェアによりサポートされているからである。

読者のターゲットシステムに何か別の C コンパイラがあるなら、 GNU CC をその機種でのネイティブ・コンパイラとしてコンフィギュレーション し、‘make libgcc1.a’ で ‘libgcc1.a’ を構築することが可能であり、 その結果得られるファイルをクロスコンパイラと共に使うことができる。 このためには、ターゲット機種で以下の手順を実行する。

 
cd target-build-dir
./configure --host=sparc --target=sun3
make libgcc1.a

次に以下をホスト機種で実行する。

 
ftp target-machine
binary
cd target-build-dir
get libgcc1.a
quit

libgcc1.a’ で必要とされる関数を提供するもう一つの方法として、 それらの関数に対して perform_… マクロを適切に 定義する方法がある。これらのマクロ定義で、これから実装しようとしている まさにその C の算術演算子を使っていなければ、読者が構築中の クロスコンパイラでコンパイルできるはずである。 (これらの定義が読者のターゲットファイルに既に存在するなら、 必要なものは揃ったことになる。)

perform_… マクロを使って ‘libgcc1.a’ を構築するには、 GNU CC を構築するときに ‘LIBGCC1=libgcc1.a OLDCC=./xgcc’ とする。 そうしない場合は、make を実行する前に、 クロスコンパイラを構築するディレクトリに、代わりのライブラリを ‘libgcc1.a’ という名前で置く必要がある。


This document was generated using texi2html 1.78.