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

3.7 collect2

GNU CC は、ほぼ全てのシステムで collect2 というユーティリティを 使って、プログラムの開始時に様々な初期化関数を 呼び出すような設定を行なう。

collect2 の仕組みは、まず一度プログラムのリンクを行ない、 リンカの出力ファイルを調べてコンストラクタ関数であることを示す名前を 持つシンボルを探す。そのようなシンボルが一つでもあれば、シンボルのテーブル を含む一時 ‘.c’ ファイルを作り、コンパイルし、そのオブジェクトファイルを 追加して二回目のリンクを行なう。

コンストラクタ群の実際の呼び出しは、__main というサブルーチンに より実行される。__main は、main 関数本体の先頭で 自動的に呼び出される(main 関数は GNU CC でコンパイルしておく必要が ある)。 __main の呼び出しは、C プログラムをコンパイルするときにも必要である。 というのは、C と C++ のオブジェクトを両方リンクするのに必要になるからである。 (‘-nostdlib’ オプションを使うと、__main の参照が解決されない。 __main が標準 GCC ライブラリで定義されているからである。 その場合は、コンパイルのコマンド行の最後に ‘-lgcc’ を付け加えれば、 解決できる。)

collect2 は、コンパイラの各パスがインストールされるディレクトリに、 ld という名前でインストールされる。 collect2 が本当の ld を探す必要があるときは、 次のようなファイルを探す。

「GNU CC の検索ディレクトリ」とは、GNU CC がコンパイラの各パスの コマンドを検索する全てのディレクトリを意味する。 ‘-B’ で指定したディレクトリも含む。

クロスコンパイラの場合の検索は若干異なる。

collect2 は、collect2 自身が起動されたときのファイル名を 使って ld を実行することを明示的に回避している。 実際に、そういうファイル名のリストを記憶している。 例えば、collect2 の一つのコピーが、検索パスの二番目の場所に ld としてインストールされた collect2 の 別のコピー(またはバージョン)を見つけたと言うような場合である。

collect2 は、nmstripld に対する上記のと同じアルゴリズムを使って検索する。


This document was generated using texi2html 1.78.