COBOL2002 使用の手引 手引編

[目次][用語][索引][前へ][次へ]

18.6.2 共用ライブラリに含まれるプログラムの呼び出し方法

共用ライブラリに含まれるプログラムの呼び出しには,静的なリンクによる呼び出しと,動的なリンクによる呼び出しの二つの方法があります。

<この項の構成>
(1) 静的なリンク
(2) 動的なリンク
(3) 注意事項
(4) プログラムのデバッグ
(5) 動的なリンクを使用するプログラム作成時の注意事項
(6) 動的なリンクを使用する場合の注意事項

(1) 静的なリンク

呼び出し元プログラムのリンク時に共用ライブラリを指定して,呼び出し先プログラム名を解決する方法です。この場合,実行可能ファイルがロードされるときに,共用ライブラリもロードされます。

共用ライブラリを静的にリンクするには,呼び出し元プログラムから定数指定のCALL文で,呼び出し先プログラムの共用ライブラリを呼び出します。

プログラム実行時,リンク時に指定した検索パスに共用ライブラリがないと,プロセス起動エラーとなります。

UNIXの場合,-DynamicLink,Callオプションを指定していない定数指定のCALL文を実行することで,静的なリンクによって呼び出しを行います。

(例)
副プログラムを含む共用ライブラリがCALL '定数'で呼ばれ,実行可能ファイルの作成時に共用ライブラリを指定してリンクした場合,静的なリンクでの呼び出しとなります。
[図データ]

(2) 動的なリンク

実行時に呼び出し先プログラムを検索する方式です。

共用ライブラリを動的にリンクするには,呼び出し元プログラムから-DynamicLink,Callオプションを指定した場合のCALL文,または-DynamicLink,IdentCallオプションを指定した場合の一意名指定のCALL文で,呼び出し先プログラムの共用ライブラリを呼び出します。

動的なリンクの場合,CALL文実行時に動的なリンクによって共用ライブラリがロードされます。

共用ライブラリのロード条件
CALL文で副プログラムを呼び出すか,またはADDR関数でプログラムのアドレスを求める場合,次に示すプログラムの優先順位に従ってプログラムが検索され,見つかったプログラムが呼び出されるか,またはアドレスが求められます。プログラムが見つからなかった場合,動的なリンクによって,共用ライブラリがロードされます。
プログラムの優先順位は次のとおりです。
  1. 呼び出しできる内側のプログラム
  2. 静的にリンクされた最外側のプログラム
  3. すでにロードされている共用ライブラリ中のプログラム

Linux,Solaris(SPARC)の場合,必ず環境変数CBLLSLIBを指定してください。

実行性能を重視するシステムでは,次に示す環境変数で検索対象となる共用ライブラリを限定することを推奨します。なお,AIX(32),AIX(64),Linux(x86),Linux(x64)の場合,動的なリンクのプレロード機能を使用してプログラム起動時に検索対象となる共用ライブラリをロードしておくことで,CALL文実行時点でのプログラム検索を高速化することもできます。動的なリンクのプレロード機能については,「18.6.3 動的なリンクのプレロード機能(AIX(32),AIX(64),Linux(x86),Linux(x64)で有効)」を参照してください。

環境変数名 概要 対象OS
CBLLPATH 検索対象となる共用ライブラリのディレクトリを指定します。指定がない場合は,カレントディレクトリだけが検索対象となります。 HP-UX(IPF)
HP-UX(IPF64)
AIX
CBLLSLIB 検索対象となる共用ライブラリを限定する場合に指定します。
Linux,Solaris(SPARC)の場合,環境変数CBLLSLIBは必ず指定してください。指定がない場合,検索する共用ライブラリがないことを意味します。
HP-UX(IPF),HP-UX(IPF64),AIX(32),AIX(64)の場合,環境変数CBLLPATHの指定に従います。
UNIX
LD_LIBRARY_PATH 共用ライブラリの検索ディレクトリを指定したいときに指定します。環境変数LD_LIBRARY_PATHに検索ディレクトリを指定しない場合,環境変数CBLLSLIBには絶対パスで共用ライブラリ名を指定してください。 Linux
Solaris(SPARC)
CBLLTAG 検索対象とする共用ライブラリの拡張子,ライブラリ種別,および検索方法を指定します。
指定がない場合は,拡張子(.so)の共用ライブラリおよびアーカイブ形式の共用ライブラリのデータセクション内のシンボル情報を検索対象にします。
AIX

注意事項
  • 環境変数CBLLPATH,CBLLSLIB,CBLLTAGは,実行単位で最初の動的なリンクによる呼び出し時に取得した値が,その実行単位中で有効になります。
  • システム環境変数LD_LIBRARY_PATHは,動的なリンクによる呼び出しをするごとに最新の値が参照されます。

環境変数CBLLPATH(HP-UX(IPF),HP-UX(IPF64),AIX(32),AIX(64)で有効)
検索対象となる共用ライブラリのディレクトリを指定します。
形式
CBLLPATH=検索ディレクトリ[:検索ディレクトリ]…
検索ディレクトリ
動的にリンクする共用ライブラリのディレクトリを指定します。
規則
  • 複数ディレクトリを検索対象とする場合,コロン(:)で区切って指定します。
  • 動的なリンクの対象となる共用ライブラリは,次のディレクトリにある共用ライブラリから順に,共用ライブラリの登録順で検索されます。
    1.環境変数CBLLPATH設定のディレクトリ下の共用ライブラリ
    2.カレントディレクトリ下の共用ライブラリ
  • 検索ディレクトリの指定がない場合は,カレントディレクトリ下の共用ライブラリだけが動的なリンクの対象となります。
  • 環境変数CBLLPATHに指定した各ディレクトリ名称に,ロード対象の共用ライブラリ名称を付加した文字列長は,終端NULL文字を含めて1,023バイトまでです。

環境変数CBLLSLIB
検索対象となる共用ライブラリを限定する場合に指定します。指定された共用ライブラリだけを検索対象とします。
形式
CBLLSLIB=共用ライブラリ名称[:共用ライブラリ名称]…
共用ライブラリ名称
動的にリンクする共用ライブラリの名称を指定します。
規則
  • 共用ライブラリ名称の指定方法には,共用ライブラリのファイル名称だけを指定する方法と,ディレクトリを含めたファイル名称を指定する方法があります。
  • ファイル名称だけを指定した場合,カレントディレクトリの共用ライブラリだけが動的なリンクの対象となります。
  • 複数の共用ライブラリを検索対象とする場合,コロン(:)で区切って指定します。コロン(:)で区切られた最後の’/’は無視されます。
  • 複数の共用ライブラリを検索対象とする場合,指定した順に検索を行うため,指定順序によって検索時間を短縮できます。
注意事項
  • LinuxまたはSolaris(SPARC)の場合,環境変数CBLLSLIBにファイル名称だけを指定したとき,カレントディレクトリは検索対象になりませんので,必ず,システム環境変数LD_LIBRARY_PATHで検索パスを設定してください。
  • AIX(32)またはAIX(64)の場合,アーカイブ形式の共用ライブラリも指定できます。
  • 環境変数CBLLSLIBの指定がない場合,ロード対象の共用ライブラリの検索方法を次に示します。
    HP-UX(IPF),HP-UX(IPF64),AIX(32),またはAIX(64)の場合は,環境変数CBLLPATHに指定したディレクトリおよびカレントディレクトリから検索します。
    LinuxまたはSolaris(SPARC)の場合,動的なリンクを使用するとき,環境変数CBLLSLIBで共用ライブラリを必ず指定してください。環境変数CBLLSLIBの指定がない場合には,検索する共用ライブラリがないことになります。

システム環境変数LD_LIBRARY_PATH(Linux,Solaris(SPARC)で有効)
共用ライブラリを動的にリンクする場合,検索ディレクトリを指定する環境変数CBLLPATHは使用できません。
共用ライブラリの検索ディレクトリを指定する場合,システム環境変数LD_LIBRARY_PATHで検索パスを設定する必要があります。システム環境変数LD_LIBRARY_PATHについては,システムのldコマンドのリファレンスを参照してください。
注意事項
  • カレントディレクトリを検索ディレクトリとする場合でも,システム環境変数LD_LIBRARY_PATHで検索パスを設定してください。

環境変数CBLLTAG(AIX(32),AIX(64)で有効)
環境変数CBLLTAGは,動的なリンクの動作を指示するオプションを指定します。
形式
CBLLTAG=オプション[:オプション]
オプション:SO/NOSO,ARMBR/NOARMBR/ARMBRLSYM
規則
  • 複数のオプションを指定する場合はコロン(:)で区切ります。
  • この環境変数に指定できるオプションを次に示します。
    SO/NOSO
    動的なリンクで,検索対象とする共用ライブラリの拡張子を選択できます。
    SOを指定した場合は,拡張子「.so」の共用ライブラリを検索対象とします。このオプションの標準値はSOです。
    NOSOを指定した場合は,拡張子「.so」の共用ライブラリを検索対象としません。ただし,すでにロードされている共用ライブラリには,このオプションは作用しません。すでにロードされている共用ライブラリとは,次に示す共用ライブラリを指します。
    ・実行可能ファイル作成時にリンクした共用ライブラリ
    ・前に呼び出したプログラムのライブラリ作成時にリンクした共用ライブラリ
    ・ロード関数により,すでにロードされている共用ライブラリ
    ARMBR/NOARMBR/ARMBRLSYM
    動的なリンクで,検索対象とするライブラリ種別や検索方法を選択できます。
    ARMBRとARMBRLSYMを指定した場合は,アーカイブ化された共用ライブラリを検索対象とします。このオプションの標準値はARMBRです。
    NOARMBRを指定した場合は,アーカイブ化された共用ライブラリを検索対象としません。
    ARMBRとARMBRLSYMの違いを次に示します。
    ・ARMBR:共用ライブラリ中のデータセクションのシンボル情報から呼び出し先プログラムを検索
    ・ARMBRLSYM:共用ライブラリ中のローダセクションのシンボル情報から呼び出し先プログラムを検索
    注 データセクションのシンボル情報は削除される場合があります。
    ARMBR/NOARMBR/ARMBRLSYMは,すでにロードされているアーカイブ化された共用ライブラリについても有効となります。そのため,NOARMBRを指定した場合は,実行可能ファイル作成時にリンクしたアーカイブ化された共用ライブラリは検索対象になりません。
    ARMBRは,データセクションのシンボル情報から呼び出し先プログラムを検索します。データセクションのシンボル情報には,エクスポートされている(外部参照できる)シンボル情報(関数名,変数名,位置,タイプ,属性情報など)およびエクスポートされていない(内部参照だけの)シンボル情報などが多数格納されています。
    ARMBRLSYMは,共用ライブラリ中のローダセクションのシンボル情報から呼び出し先プログラムを検索します。ローダセクションのシンボル情報には,エクスポートされている(外部参照できる)シンボル情報だけが格納されています。
    共用ライブラリのファイル構造については,システムのリファレンスなどを参照してください。
    検索方法の違いから,ARMBRよりARMBRLSYMを指定する方がプログラム検索が高速になります。ただし,ARMBRLSYMを指定するとARMBRとは呼び出し先プログラムが異なる場合があります。
    アーカイブ化された共用ライブラリが検索ディレクトリに存在するかどうかによって,プログラム検索がより高速となる指定を次に示します。
    アーカイブ化された共用ライブラリ 呼び出しプログラム プログラム検索が高速な指定
    検索ディレクトリに存在する アーカイブ化された共用ライブラリに含まれる ARMBRよりARMBRLSYMの方が高速となる
    アーカイブ化された共用ライブラリに含まれない ARMBRよりNOARMBRの方が高速となる※1
    検索ディレクトリに存在しない なし ARMBRよりNOARMBRの方が高速となる※2
    注※1
    検索ディレクトリに存在するアーカイブ化された共用ライブラリ,および静的にリンクされているアーカイブ化された共用ライブラリの数や大きさによっては,NOARMBRよりもARMBRLSYMを指定した方が,プログラム検索が高速な場合があります。
    注※2
    静的にリンクされているアーカイブ化された共用ライブラリの数や大きさによっては,NOARMBRよりもARMBRLSYMを指定した方が,プログラム検索が高速な場合があります。
注意事項
  • この環境変数を使用する場合は,プログラムの開発環境と実行環境で,必ず,同じオプションを指定してください。
  • 環境変数CBLLSLIBに拡張子「.so」の共用ライブラリ指定した場合,環境変数CBLLTAGにNOSOを指定したときでも,環境変数CBLLSLIBに指定された共用ライブラリは検索対象となります。
  • NOSO,NOARMBRオプションを指定する場合は,動的なリンクで呼び出すサブプログラムは,次に示す点に注意して作成してください。
    指定するオプション 共用ライブラリファイル作成時の注意点
    NOSOオプション 共用ライブラリファイルはldコマンドで作成し,拡張子は「.a」にしてください。拡張子を「.so」にした場合は,動的なリンクで呼び出すことができません。
    NOARMBRオプション 共用ライブラリファイルは,ldコマンドで作成してください。
    ldコマンドで作成した共用ライブラリをarコマンドでアーカイブファイル化した場合は,動的なリンクで呼び出すことができません。
  • ARMBRLSYMオプションの指定の有無で,ldコマンドの-sオプションやstripコマンドでシンボル情報を除去した実行可能ファイルや,共用ライブラリ内のプログラムは動的なリンクでの呼び出し可否が次のように異なります。
    ARMBRLSYMオプションの指定 あり なし
    ldコマンドの-sオプションやstripコマンドでシンボル情報を除去した実行可能ファイルや共用ライブラリ内のプログラムの呼び出し 呼び出せる 呼び出せない
    ldコマンドの-sオプションやstripコマンドでシンボル情報を除去した実行可能ファイルや共用ライブラリ内のプログラムを呼び出す可能性がある場合は,ARMBRLSYMオプションの指定によって呼び出し先プログラムが変わるおそれがあります。動的なリンクのプログラム検索トレース機能を使用して呼び出し先プログラムが変わらないことを確認することを推奨します。
    注※
    ldコマンドの-sオプションやstripコマンドは,オブジェクト中のデータセクションのシンボル情報を削除することでオブジェクトサイズを小さくするための機能です。詳細は,ldコマンドおよびstripコマンドのリファレンスを参照してください。

アーカイブ形式の共用ライブラリ(AIX(32),AIX(64)で有効)
AIX(32)またはAIX(64)では,共用ライブラリをarコマンドによってアーカイブファイルにして(アーカイブ形式の共用ライブラリ),共有オブジェクトのメンバとして扱うことができます。arコマンドの使用例は,「34. 実行可能ファイルと共用ライブラリの作成」を参照してください。
AIX(32)またはAIX(64)で共用ライブラリを動的にリンクする場合,アーカイブ形式の共用ライブラリ中のプログラムを動的なリンクで呼び出せます。
ロード対象
環境変数CBLLSLIBにアーカイブ形式の共用ライブラリを指定した場合,アーカイブファイルにある共有オブジェクトのメンバがロード対象になります。
環境変数CBLLSLIBの指定がない場合,カレントディレクトリおよび環境変数CBLLPATHで指定したディレクトリ下のすべての共用ライブラリがロード対象となります。また,その共用ライブラリがアーカイブ形式の場合,ファイル中の共有オブジェクトのメンバがロード対象となります。
注意事項
  • ネストされたアーカイブは使用できません(ネストされたアーカイブとは,arコマンドでいったん作成したアーカイブを,さらにarコマンドでアーカイブ化することです)。
  • アーカイブ形式の共用ライブラリに同じ名称のメンバが複数存在する場合は,最初のメンバを対象とします。
  • アーカイブ形式の共用ライブラリを静的にリンクした場合は,アーカイブ形式でない共用ライブラリを静的にリンクした場合と同じく,リンク時に指定した共用ライブラリが実行開始時にロードされます。

指定が必要なライブラリ(HP-UX(IPF),HP-UX(IPF64)で有効)
動的なリンクを使用する場合,ELFアクセスライブラリ(libelf.sl)が必要です。

(例)
一意名指定のCALL文での呼び出しの場合は,動的なリンクでの呼び出しとなります。
[図データ]

注意事項
  • 環境変数の値は,プログラムで最初に呼ばれたCALL文の実行時に取得した値が,そのプログラム中で有効になります。

(3) 注意事項

(4) プログラムのデバッグ

実行可能ファイルに静的にリンクしたCOBOLプログラムと同様に,動的にリンクした共用ライブラリについてもテストデバッガを使用したデバッグができます。

(5) 動的なリンクを使用するプログラム作成時の注意事項

プログラムの作成時には次のような注意が必要になります。

プログラムの作成方法については,「34. 実行可能ファイルと共用ライブラリの作成」を参照してください。

(6) 動的なリンクを使用する場合の注意事項

動的なリンクでは,独自に共用ライブラリのロードやアンロードを管理しています。そのため,プログラムの実行中に,共用ライブラリのロードやアンロードに関連するシステム関数を,ユーザプログラムから呼び出してはなりません。

注※
共用ライブラリのロードやアンロードに関連するシステム関数は,次のとおりです。
HP-UX(IPF),HP-UX(IPF64)の場合
shl_load,shl_unload
AIX(32),AIX(64),Linux,Solaris(SPARC)の場合
dlopen,dlclose