| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
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 を探す必要があるときは、
次のようなファイルを探す。
PATH に列挙されているディレクトリにある ‘real-ld’。
REAL_LD_FILE_NAME
で指定されたファイル。
collect2 は自分自身を再帰的に実行することはない。
PATH にある ‘ld’。
「GNU CC の検索ディレクトリ」とは、GNU CC がコンパイラの各パスの コマンドを検索する全てのディレクトリを意味する。 ‘-B’ で指定したディレクトリも含む。
クロスコンパイラの場合の検索は若干異なる。
PATH にある ‘target-real-ld’。
REAL_LD_FILE_NAME
で指定されたファイル。
PATH.
PATH にある、‘target-ld’。
collect2 は、collect2 自身が起動されたときのファイル名を
使って ld を実行することを明示的に回避している。
実際に、そういうファイル名のリストを記憶している。
例えば、collect2 の一つのコピーが、検索パスの二番目の場所に
ld としてインストールされた collect2 の
別のコピー(またはバージョン)を見つけたと言うような場合である。
collect2 は、nm と strip を
ld に対する上記のと同じアルゴリズムを使って検索する。
This document was generated
using texi2html 1.78.