リンカーとライブラリ

セクションの初期設定と終了

.init.fini セクションタイプを使用すると、実行時の初期設定および終了処理が行えます。これらのセクションタイプは、他のセクションと同様に入力再配置可能オブジェクトから結合されます。ただし、コンパイラドライバからも、入力ファイルリストの冒頭部分と末尾に付加する追加ファイルの一部として、.init.fini を指定できます。

これらのファイルには、.init および .fini コードを、それぞれ予約シンボル名 _init_fini のにより識別される個別の機能にカプセル化する効果があります。

動的実行可能プログラムまたは共有オブジェクトを構築すると、リンカーにより出力ファイルのイメージ内のこれらのシンボルアドレスが記録されます。そのため、初期設定および終了処理中は、動的実行可能プログラムまたは共有オブジェクトは実行時リンカーによって呼び出すことができます。これらのセクションの実行時処理の詳細については、「デバッギングエイド」を参照してください。

.init.fini セクションの作成は、アセンブラを使用して直接実行できます。あるいは、コンパイラの中にはその宣言を単純化するための特別なプリミティブを提供しているものもあります。たとえば、次のコードセグメントの結果、関数 foo に対する「呼び出し」が .init セクション内に配置され、関数 bar に対する「呼び出し」が .fini セクション内に配置されます。


#pragma init (foo)
#pragma fini (bar)
foo()
{
    /* Perform some initialization processing. */
    ...... 
}   

bar()
{
    /* Perform some termination processing. */
    ....... 
}

共有オブジェクトとアーカイブライブラリの両方に組み込むことができる、初期設定コードと終了コードの設計をするときには注意が必要です。このコードが、アーカイブライブラリ内のいくつかの再配置可能オブジェクト全体に分散された場合、このアーカイブを使用したアプリケーションのリンク編集は、モジュールの一部しか抽出できないため、初期設定コードと終了コードの一部だけしか抽出できません。そして実行時に、コードのこの部分だけが実行されます。

共有オブジェクトがアプリケーションの依存関係の一つとして対応付けされている場合は、共有オブジェクトに対して構築された同じアプリケーションには、実行時に実行される、累積した初期設定コードと終了コードがすべて入っています。

また、.init コードが、dldump(3DL) を使用してメモリーをダンプできる動的オブジェクトとともに組み込まれている場合は、データの初期設定は独立させることをお勧めします。