[ < ] | [ > ] | [ << ] | [ 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.