一部のモジュールを静的に、その他のモジュールを動的にリンクする場合、次の操作を行う必要があります。
- 実行可能プログラムをビルドする際にリンカー指令 CALL を指定します。このためには、[Build Settings] ダイアログ ボックスの [Assembler] ページの [Link] ページで [Resolve external calls at link time] をオンにします。CALL を設定すると、リンカーはすべての外部参照を解決しようとします。
- 動的に呼び出すモジュールごとに、TYPE=COBOL または TYPE=ASM オペランドを指定して INCLUDE コマンドをリンク ファイルにインクルードします。
. リンカーが INCLUDE コマンドを処理する場合、モジュールは実際にインクルードされませんが、代わりに該当のエントリ ポイントを動的に呼び出す小さなアセンブラー モジュールが生成されてインクルードされます。実行時に CALL を実行すると、アセンブラー モジュールは COBOL ランタイム システムにモジュールをロードして制御をそのモジュールに転送するように要求します。
静的にリンクされたモジュールで定義されたエントリ ポイントの中で、動的にリンクされたモジュールのエントリ ポイントと一致するポイントがある場合、リンカー指令 NOEXPORT を使用して、メモリへのモジュールのロード後に呼び出し元のプログラムで利用できる実行可能プログラムにリンカーがエントリを作成できないようにする必要があります。
デフォルトでは、すべてのアセンブラー モジュールの ENTRY、CSECT または START シンボルが COBOL ランタイム システムのエントリ ポイント テーブルに通常ロードされるため、NOEXPORT によってこの動作は防止されます。
また、静的にリンクされたモジュール (メインの実行可能プログラムを含む) に対して ALIAS リンク ファイル コマンドも使用します。
この技術により、各モジュールに使用するリンクのタイプを正確に制御できます。