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

17.16.6 初期化ルーチンを制御するマクロ

以下のマクロは、コンパイラが初期化関数と終了関数をどのように 扱うかを制御する。

INIT_SECTION_ASM_OP

一個の C の文字列定数。定義されていれば、続くデータを初期化コードとして 特定するアセンブラ命令を表す。定義されていないと、GNU CC は そのようなセクションは存在しないと仮定する。初期化関数と終了関数用に 特別なセクションを使っているときは、このマクロは ‘crtstuff.c’ と ‘libgcc2.c’ がどのように初期化関数を編成して実行するかをも 制御する。

HAS_INIT_SECTION

これが定義されていると、main で上述の __main を 呼び出さないようにする。このマクロは、初期化セクションの内容を シンボル一つ毎に制御するシステム、例えば OSF/1 では定義すべきである。 そして、INIT_SECTION_ASM_OP をサポートしているシステムでは 明示的には定義すべきでない。

LD_INIT_SWITCH

一個の C の文字列定数。定義されていれば、リンカに対して 続くシンボルが初期化ルーチンであることを知らせるスイッチである。

LD_FINI_SWITCH

一個の C の文字列定数。定義されていれば、リンカに対して 続くシンボルが終了ルーチンであることを知らせるスイッチである。

INVOKE__main

このマクロが定義されていると、INIT_SECTION_ASM_OP の 有無に関わらず main から __main を呼び出す。 初期化セクションが自動的には実行されないが、 コンストラクタとデストラクタのリストを集めるのに使えるシステムでは、 このマクロを定義すべきである。

ASM_OUTPUT_CONSTRUCTOR (stream, name)

このマクロには一個の C の文を定義する。この文は、 stream にアセンブラコードを出力する。 このアセンブラコードは、初期化時に name という名前の関数を呼び出す ように調整を行なう。

name は、コンパイラにより自動的に生成された C の関数名であると 仮定する。この関数には引数はない。 関数 assemble_name を使えば、name という名前を出力できる。 この関数は、アンダースコアを追加するといった、システム固有の 文法的変換を行なう。

このマクロを定義しない場合は、その関数を呼び出すように調整するための 特別な出力は行なわれない。 これは、その関数が何か他の手段で呼び出されるなら正しい動作である。 その手段としては、例えば、collect2 プログラムによるものがある。 collect2 は、シンボルテーブルを見て名前から該当する関数を 見つけ出す。

ASM_OUTPUT_DESTRUCTOR (stream, name)

これは、初期化関数ではなくて終了関数に対して使われることを 除けば ASM_OUTPUT_CONSTRUCTOR と同じである。

ASM_OUTPUT_CONSTRUCTORASM_OUTPUT_DESTRUCTOR が 定義されている場合、生成されたオブジェクトファイル用に生成される 初期化ルーチンは静的なリンケージを持つ。

システムがコンストラクタを処理する手段として collect2 を 使っているなら、collect2 は通常 nm を使って、 呼び出すべきコンストラクタ関数を探すためにオブジェクトファイルを 走査する。そういうシステムでは、ASM_OUTPUT_CONSTRUCTORASM_OUTPUT_DESTRUCTOR を、グローバルスコープを持たなければならない、 オブジェクトフィアルの初期化ルーチンとして定義してはならない。

ある一定のシステムでは、以下のマクロ群を定義することで、 collect2 の動作をより速くすることができる。 (そして、ある場合には、なにはともあれ動作するようにはなる。)

OBJECT_FORMAT_COFF

COFF(Common Object File Format) のオブジェクトファイルを使っているなら、 このマクロを定義する。そうすると、collect2 がこのフォーマットを 前提として、動的なコンストラクタ/デストラクタ関数を探すのに、 直接オブジェクトファイルを走査することができるようになる。

OBJECT_FORMAT_ROSE

ROSE 形式のオブジェクトファイルを使っているなら、 このマクロを定義する。そうすると、collect2 がこのフォーマットを 前提として、動的なコンストラクタ/デストラクタ関数を探すのに、 直接オブジェクトファイルを走査することができるようになる。

これらのマクロはネイティブコンパイラの場合にのみ有効である。 クロスコンパイラの場合は、collect2 は常にターゲット機種用の nm を使う。

REAL_NM_FILE_NAME

nm を実行するのに使用するファイル名を表す C の文字列定数を 定義する。デフォルトは、nm をパスから検索する。

システムが共有ライブラリをサポートしており、指定したライブラリや 実行形式の動的な依存関係を表示するプログラムがあるなら、 以下のマクロ群を定義することで、共有ライブラリ内の初期化関数と 終了関数の実行をサポートするようにできる。

LDD_SUFFIX

ダイナミックリンクにおける依存関係を出力するプログラム、 例えば SunOS 4 の場合だと "ldd" のようなプログラムの 名前を C の文字列定数として定義する。

PARSE_LDD_OUTPUT (PTR)

LDD_SUFFIX で指定されるプログラムの出力からファイル名を 取り出す C のコードを定義する。 PTR は、char * 型の変数で、LDD_SUFFIX の 出力のある行の先頭を指す。 その行が動的な依存関係を示しているなら、そのコードはその行の上で ファイル名の先頭まで PTR を進めなければならない。 動的な依存関係でなければ、PTRNULL に 設定しなければならない。


This document was generated using texi2html 1.78.