この章では、呼び出し可能な共有オブジェクトについて説明します。
UNIX オペレーティングシステムには、共有オブジェクトを作成し、実行するための基本的な機能が備わっています。ご使用の COBOL システムはこの機能を利用し、呼び出し可能な共有オブジェクトを使って COBOL 固有の追加機能を提供します。 ご使用の COBOL システムでは、共有ライブラリを作成することもできます。システムの実行可能プログラムを作成するには、特定の形式の共有オブジェクトが使用されます。詳細は、『アプリケーションのパッケージ化』の章、および『システムの実行可能プログラムへのリンク』の章を参照してください。
呼び出し可能な共有オブジェクトは Cob ユーティリティを使用して作成します。詳細は、次の『呼び出し可能な共有オブジェクトの作成』 の項を参照してください。Cob ユーティリティの使用方法については、『COBOL システムインターフェイス (Cob)』の章を参照してください。64 ビットモードで使用している場合は、『32 ビットモードおよび 64 ビットモードでの作業』の章も参照してください。
呼び出し可能な共有オブジェクトは、指定により、実行時に動的にロードされます。つまり、主入口点として (たとえば、cobrun で) 参照された場合や、COBOL の CALL 文でロードされます。呼び出し可能な共有オブジェクトの全ての入口点が取り消されると、呼び出し可能な共有オブジェクトはアンロードされ、使用されているメモリが開放されます。
この動作は、.int コードおよび .gnt コードと同じですが、リンクされた共有ライブラリや、システムの実行可能プログラムとは異なります。リンクされた共有オブジェクトや、システムの実行可能プログラムは、使用されるかどうかに関わらず、常にプロセスの開始時にロードされます。また、これらで使用されるコードとメモリは、プロセスの終了時にのみアンロードされます。
呼び出し可能な共有オブジェクトには、複数の COBOL プログラムを組み込むことができ、C、および C++ などの他の言語のプログラムも組み込むことができます。呼び出し可能な共有オブジェクトを、サードパーティのオブジェクトファイルや共有ライブラリにリンクすることもできます。これは、システムの実行可能プログラムや共有ライブラリと同じ動作ですが、.int ファイルや .gnt ファイルとは異なります。 .int ファイルや .gnt ファイルは、1 つのファイルが 1 つの COBOL プログラムに相当します。
呼び出し可能な共有オブジェクトは cob -z コマンドを使用して作成します。
次に例を示します。
cob -z myprog.cbl
このように指定すると、呼び出し可能な共有オブジェクト myprog.so が作成されます。これがアプリケーションのメインの (または唯一の) モジュールである場合は、次のようにして実行することができます。
cobrun myprog
詳細は、『実行』
の章を参照してください。また、myprog が副プログラムの場合は、COBOL の CALL 文を CALL "myprog"
のように使用してロードし、実行することができます。このプログラムを中止する、またはアンロードするには、CANCEL "myprog"
のように入力します。
複数の COBOL プログラムを連結して、1 つの呼び出し可能な共有オブジェクトにすることができます。この方法だと、COBOL プログラム間の参照はすべて直接参照を使って解決することができます。これだと、dynamic loader を使って検索してから他のモジュールをロードする必要がないため効率的です。次に例を示します。
cob -z myprog.cbl subprog.cbl entry.cbl
このように指定すると、すべての COBOL プログラムがコンパイル、およびリンクされ、myprog.so が作成されます。主入口点は myprog です。これは最初に指定された COBOL プログラム、myprog.cbl の主入口点です。
作成された呼び出し可能な共有オブジェクトの名前は、cob の -o フラグを使用して指定することができます。次に例を示します。
cob -zo entry.so myprog.cbl subprog.cbl entry.cbl
このように指定すると、すべての COBOL プログラムがコンパイル、およびリンクされ、entry.so が作成されます。 呼び出し可能な共有オブジェクトの基本名 entry が主入口点となります。つまり、entry
は entry.cbl の主入口点となります。
入口点も、cob に -e オプションを使って指定できます。この機能は、作成したアプリケーションの名前が、ソースプログラムのファイル名と異なる場合に役立ちます。次に例を示します。
cob -zo myapp.so myprog.cbl subprog.cbl entry.cbl -e entry
このように指定すると、すべての COBOL プログラムがコンパイル、およびリンクされ、myapp.so が作成されます。 主入口点には entry
が指定されています。これは、entry.cbl の主入口点です。-e オプションを使用すると、どんな COBOL プログラムのどんな入口点でも指定できます。
-e オプションを指定しないと、呼び出し可能な共有オブジェクトの基本名が、主入口点として使用されます。主入口点が実行時に検出されないと、呼び出し可能な共有オブジェクトはロードされず、実行時ロードエラーになります。
cob の -e および -o フラグに関する詳細は、『cob のフラグの説明』の章を参照してください。
LITLINK コンパイラ指令を指定してコンパイルしたプログラムを、COBOL 文、 CALL "literal"
を使用して呼び出すと、literal への直接参照が実行されます。このような参照は、同じ名前の入口点に確実に結び付けられます。この入口点は、呼び出し可能な共有オブジェクトを作成する際に、cob
行で指定されたプログラム内に定義されています。直接参照先の名前に相当する入口点名が、呼び出し可能な共有オブジェクトの作成時に指定されたプログラムのいずれにも存在しない場合は、この参照を未解決の参照と呼びます。
呼び出し可能な共有オブジェクトが実行時にロードされると、オペレーティングシステムの動的リンカですべての未解決の参照が解決されます。この時、システムの実行可能ファイルのシンボル、ロード済みの共有ライブラリ、およびロード済みの呼び出し可能な共有オブジェクトがリンカで使用されます。解決されないシンボルがあると、呼び出し可能な共有オブジェクトはロードされず、ロードエラーになります。プラットフォームによっては、未解決のシンボルの名前が一覧表示されるものもあります。
ロードエラーを防ぐには、呼び出し可能な共有オブジェクトを作成する際に、すべての未解決の参照を解決する必要があります。これには cob で -d または -U オプションを使用します。
未解決の参照の名前が解っている場合は、-d オプションを使用して解決できます。次に例を示します。
cob -z myprog.cbl subprog.cbl entry.cbl -d myref
このように指定すると、指定された COBOL プログラムのいずれかにある myref
への参照が解決されます。実行時に呼び出されると、myref
は、標準の検索規則に従って動的にロードされます。標準の検索規則では、まず、現在ロード済みの入口点で myref が検索され、検出されなければ、次にディスク上で myref
(たとえば myref.so など) が検索されます。
すべての未解決の参照を一覧表示するには、呼び出し可能な共有オブジェクトを作成する際に、cob の -z,U
オプションを使用します。次に例を示します。
cob -z,U myprog.cbl subprog.cbl entry.cbl
このように指定すると、myprog.so が作成され、未解決の参照が一覧表示されます。cob に -d オプションも追加すると、参照を解決することができます。ただし、シンボルが呼び出し側のシステムの実行可能プログラムにリンクされることが解っている場合 (cobrun または cobrun_t を使用しない場合) や、シンボルが定義されている呼び出し可能な共有オブジェクトが既にロード済みであることが解っている場合は、これらのシンボルに対して -d オプションを使用する必要はありません。
全ての未解決の参照を解決するには、cob で -U オプションを使用します。次に例を示します。
cob -z myprog.cbl subprog.cbl entry.cbl -U
このように指定すると、すべての未解決の参照が解決された状態で myprog.so が作成されます。
cob の -z オプションを使用すると、ソースコードプログラムと同様に、.int ファイルやシステムオブジェクト (.o) ファイルを入力して渡すことができます。つまり、C、および C++ ソースやオブジェクトコードを、呼び出し可能な共有オブジェクトにリンクさせることができます。
次に例を示します。
cob -zo myapp.so mycobol.cbl myint.int myc.c myobj.o -e myentry
このように指定すると、myapp.so は、COBOL プログラム、 mycobol.cbl および myint.int、C
のソースコード、 myc.c、およびオブジェクトファイル、 myobj.o を使って作成されます。オブジェクトファイルは、COBOL、C、C++、またはその他の言語で書かれたものや、サードパーティのシステムオプジェクトファイルを使用することができます。主入口点には、指定されたモジュールのいずれかに含まれているはずの
myentry
が指定されます。
C++ を含む呼び出し可能な共有オブジェクトを作成する場合は、最終的には C++ コンパイラで呼び出し可能な共有オブジェクトが作成できるように、-z,CC
オプションを使用する必要があります。次に例を示します。
cob -z,CC -o myapp.so mycobol.cbl myc.c mycpp.C -e myentry
このように指定すると、myapp.so は、COBOL プログラム、 mycobol.cbl、C のソースコード、 myc.c、および
C++ のソースファイル、 mycpp.C を使って作成されます。 主入口点には、指定されたモジュールのいずれかに含まれているはずの myentry
が指定されます。
cob に -l および -L オプションを使用して、共有ライブラリを呼び出し可能な共有ライブラリにリンクすることができます。共有ライブラリは、呼び出し可能な共有オブジェクトがロードされるとロードされ、アンロードされるとアンロードされます。次に例を示します。
cob -Z mylib.cbl myobj.o cob -zo myapp.so myprog.cbl myc.c -L. -lmylib -e myentry
このように指定すると、共有ライブラリ、 libmylib.so が作成され、これが myapp.so にリンクされます。myapp.so が実行時にロードされると、オペレーティングシステムは、共有ライブラリ libmylib.so を検索してロードします。共有ライブラリに関する詳細は、『システムの実行可能プログラムへのリンク』の章を参照してください。
呼び出し可能な共有オブジェクトに、COBOL を含める必要はありません。また、C または C++ のオブジェクトや、サードパーティが提供するオブジェクトを含めることもできます。
Object COBOL バージョン 4.1 以降の製品では、C、C++、またはサードパーティのオブジェクトは、システムの実行可能プログラムや、新規の RTS にリンクする必要がありました。本バージョンからは、これらを呼び出し可能な共有オブジェクトにリンクできるため、その必要がなくなります。C、C++、またはサードパーティのオブジェクトや共有ライブラリを、呼び出し可能な共有オブジェクトにリンクできるため、アプリケーションの作成時の柔軟性が広がります。
たとえば、必要なサードパーティの製品がマシンにインストールされていないような状況に対処できるアプリケーションをコーディングすることができます。具体的には、サードパーティのオブジェクト、および共有ライブラリを、システムの実行可能プログラムではなく、呼び出し可能な共有オブジェクトにリンクすると、このようなアプリケーションが作成できます。必要なときに、COBOL ON EXCEPTION 構文を使用して、この呼び出し可能な共有オブジェクトをロードします。必要なサードパーティの製品がインストールされていない場合は、呼び出し可能な共有オブジェクトはロードされず、プログラムの ON EXCEPTION のルートが使用されます。
Copyright © 2005 Micro Focus International Limited. All rights reserved.