共有ライブラリーと遅延ロード
デフォルトでは、モジュールのロード時に、システム・ローダーは、自動的に モジュールの従属のすべてを同時にロードします。 従属のロードが起こるのは、モジュールのリンク時に、 モジュールの従属モジュールのリストが、 モジュールのローダー・セクションに保存されるためです。
| モジュール | 説明 |
|---|---|
| dump -H | 従属モジュール・リストの表示を可能にするコマンド。 |
| -blazy | AIX® 4.2.1以降では、モジュール内の関数が最初に使用されたときに、その依存関数の一部だけがロードされるようにモジュールをリンクするリンカー・オプション。 |
遅延ロードを使用すると、モジュールの従属のほとんどが実際には使用されない場合は、 プログラムのパフォーマンスを向上させることができます。 一方、遅延ロード・モジュールの関数呼び出しごとに約 7 つ分の命令のオーバーヘッドが追加され、 関数の最初の呼び出しで、定義モジュールのロードと、関数呼び出しの変更が必要になります。 したがって、モジュールの関数呼び出しが、その従属のほとんどで行われるような場合は、 遅延ロードが適切でないことがあります。
遅延ロード・モジュールで定義された関数が初めて呼び出されるときは、 定義モジュールのロードと希望する関数の検出が試みられます。 モジュールが見つからない場合、または関数がモジュールによってエクスポートされていない場合、デフォルトの動作ではエラー・メッセージを標準エラーに印刷し、戻りコード 1 を戻します。 アプリケーションは、関数 _lazySetErrorHandler を呼び出して、エラー・ハンドラーのアドレスを提供することによって、独自のエラー・ハンドラーを提供することができます。 エラー・ハンドラーは、モジュールの名前、シンボルの名前、 およびエラーの原因を示すエラー値 の 3 つの引数によって呼び出されます。 エラー・ハンドラーが戻る場合は、 その戻り値は、希望する関数に代わる関数のアドレスになります。 _lazySetErrorHandler の戻り値は、エラー・ハンドラーが存在しない 場合は NULL であり、存在する場合は直前のハンドラーのアドレスです。
遅延ロードを使用しても、通常プログラムの振る舞いは変更されませんが、 いくつかの例外があります。 まず、モジュールが異なる順序でロードでき、 かつモジュールによってはまったくロードされないものがあるために、 モジュールのロード順序に依存するプログラムは影響を受けることになります。
次に、関数ポインターを比較するプログラムは、 単一関数が複数のアドレスを持つことができるた め、遅延ロードが使用された場合は、正しく働かないことがあります。 特に、モジュール A がモジュール B の関数 f を呼び出し、かつモジュール B の遅延ロード がモジュール A のリンク時に指定された場合は、モジュール A で計算された f のアドレスは、 ほかのモジュールで計算された f のアドレスと異なります。 したがって、遅延ロードを使用すると、 同じ関数を指している場合でも、2 つの関数ポインターが等しくない場合があります。
3 番目に、モジュールが相対パス名でロードされ、 かつプログラムが作業ディレクトリーを変更す ると、従属モジュールのロードが必要なときに、それが検出されないことがあります。 遅延ロードを使用するときは、リンク時に従属モジュールを参照する際、 絶対パス名のみを使用してください。
遅延ロードを使用可能にする決定は、モジュールごとにリンク時に行います。 単一プログラムでは、遅延ロードを使用するモジュールと、使用しないモジュールを混合すること ができます。 単一モジュールをリンクするときは、従属モジュール内の変数を参照すると、 そのモジュールは遅延ロードされません。 モジュールへの参照がすべて関数シンボルであると、 従属モジュールは遅延ロードすることができます。
遅延ロード機能は、スレッド化アプリケーションと 非スレッド化アプリケーションの両方で使用することができます。
遅延ロード実行のトレース
ロード・アクティビティーをその発生時に表示できる実行時機能があります。 これは、環境変数の LDLAZYDEBUG を用いて行われます。 この変数の値は、以下の値の 1 つまたは複数の合計である、10 進、8 進 (先行 0)、 もしくは 16 進 (先行 0x) の数値です。
| 変数 | 説明 |
|---|---|
| 1 | ロード・エラーまたはルックアップ・エラーを示す。 必要なモジュールが検出されない場合は、メッセージが表示され、 遅延ロード・エラー・ハンドラーが呼び出されます。 要求されたシンボルが、ロードされた参照モジュールで使用できない場合は、 エラー・ハンドラーの呼び出し前にメッセージが表示されます。 |
| ※2 | トレース・メッセージ
を stdout ではなく stderr に書き出す。 デフォルトでは、これらのメッセージは 標準の出力ファイル・ストリームに書き出されます。 この値は、標準のエラー・ストリームを選択します。 |
| 4 | ロードされるモジュールの名前を表示する。 関数呼び出しの解決に新規モジュールが必要なときは、 検出されロードされるモジュールの名前を表示します。 これが起こるのは、そのモジュール内の関数を最初に参照するときのみです。 すなわち、モジュールは、一度ロードされると、そのモジュール内の 関数の次の参照で引き続き使用することができます。 追加のロード操作は不要です。 |
| 8 | 呼び出された関数の名前を表示する。 必要な関数の名前を、関数の供給元と考えられるモジュールの名前とともに表示します。 この情報は、モジュールのロード前に表示されます。 |