第 8 章 システムの実行可能プログラムへのリンク

この章では、複数のプログラムをリンクして、システムの実行可能プログラムを作成する方法を説明します。

8.1 はじめに

Server Express を使用すると、リンクされたシステムの実行可能プログラム、または動的にロードされるプログラム (.int ファイル、.gnt ファイル、および呼び出し可能な共有オブジェクト) を実行できます。これらのプログラムやファイルは、Cob ユーティリティにオプションを指定して出力することができます。

UNIX システムには、プログラムのビルドと実行に必要な基本的な機能が備わっています。 Server Express はこの機能を利用し、更に、COBOL 固有の追加機能を提供します。 通常の場合、単純なアプリケーションを作成する場合は、Server Express によるプログラムのビルドや実行方法について詳しく知る必要はありません。Cob ユーティリティは、デフォルトで、一般的に有効な設定になっています。この場合は、この項を飛ばし、『簡単なデフォルトのリンク』の章に進み、cob コマンドとデフォルトのリンクに関する基本的な説明をお読みください。ビルドしたアプリケーションが UNIX で処理される方法を最適化したり、作成するアプリケーションに非 COBOL ルーチンを組み込む場合は、利用できる機能や、COBOL システムでそれらがどのように使用されるかについて詳しく知っておく必要があります。その場合には、この項をお読みください。

この項では、次の内容を説明します。

Cob ユーティリティの使用方法については、『COBOL システムインターフェイス (Cob)』の章を参照してください。 64 ビットモードで使用している場合は、『32 ビットモードおよび 64 ビットモードでの作業』の章も参照してください。

8.1.1 UNIX のシステムリンカとシステムローダー

プログラミング言語のコンパイラでは、一般的に、プログラムはリンクされず、個別のオブジェクト (.o) ファイルとして出力されます。 このタイプのファイルは不完全なため、直接実行することはできません。このタイプのファイルを実行するには、システムや言語の様々なサポートルーチンが必要で、場合によっては、実行時に必要なサブルーチンを用意して呼び出す必要があります。このようなファイルは、システムの実行可能ファイルや共有ライブラリファイルをビルドする際に使用します。この時、システムリンカを使って、実行時に必要なすべてのプロシージャ参照が必要なコードのインスタンスにリンクされます。

システムの実行可能ファイルには通常、ファイル名拡張子はありません。UNIX システムのプロンプトでファイルの名前を入力すると、システムの実行可能ファイルを実行することができます。システムの実行可能ファイルが実行されると、UNIX は、システムローダーを起動して、プログラムファイルをロードします。この時、リンクされたプロシージャもともにロードされます。システムローダーは、すべてのプロシージャ参照を、ロードされたプロシージャのコピーに結び付けます。

8.1.1.1 リンクと結合

共有ライブラリファイルには、プリフィックス lib が付き、ファイル名拡張子は .so (HP-UX PA-RISC では .sl ) になります。共有ライブラリは、1 つ、または複数のシステムの実行可能プログラムにリンクすることができます。複数のシステムの実行可能プログラムが実行されると、システムローダは共有ライブラリのコピーの 1 つをロードします。この時、システムローダは、すべての実行可能プログラムのコード領域を共有し、データ領域は実行可能プログラムごとに別々に作成します。共有ライブラリは、システムの実行可能プログラムのプロセスが終了するまでアンロードされません。

共有ライブラリと、呼び出し可能な共有オブジェクトを混同しないようにしてください。どちらのファイル名拡張子も同じ .so ですが、性質は異なります。呼び出し可能な共有オブジェクトは、呼び出し可能なファイル形式であるため、実行時に、必要に応じて動的にロードしたり、アンロードすることができます。共有ライブラリは呼び出し可能な共有オブジェクトにリンクすることができます。詳細は、『呼び出し可能な共有オブジェクト』の章を参照してください。

プログラム、またはサブプログラムの結合は、実行時にシステムローダーで行われます。実行可能ファイルに、共有ライブラリファイル内の外部のプロシージャ (サブプログラム、またはメインプログラム) への参照が含まれている場合は、そのプロシージャが実行可能であることを、システムローダが確認します。システムローダは、そのプロシージャに多くのユーザ、またはアプリケーションが関連付けられている場合でも、すべてのユーザ、またはアプリケーションで、動的に結び付けられたプロシージャのメモリ上の 1 つのコピーを共有できるようにします。

プロシージャのリンクは、リンク時に、システムリンカで実行されます。リンカでは、リンクされたプロシージャのコードはシステムの実行可能ファイルに組み込まれません。そのかわりに、それらのプロシージャのオブジェクトコードが含まれている共有ライブラリファイルへの参照が組み込まれます。

8.1.2 リンク

動的にリンク可能なコードは、共有ライブラリファイルとして保存されます。これらのファイルは実行時に必要とされるまで、ディスク上に保存されています。共有ライブラリファイルは、システムリンカで作成される実行可能形式のファイルですが、システムの実行可能ファイルのような、それ自体を実行できるファイルとは異なり、最初の入口点がありません。共有ライブラリを使うと、サブプログラムの 1 つのコピーを、異なる複数のプロセスで共有できるため、ディスクを節約することができます。

リンク時に、適切な共有ライブラリファイルが検出できない場合は、かわりに、これに相当するアーカイブライブラリ (.a) が検索されます。このライブラリは、静的にリンクされています。

静的にリンクされたコードは、複数の標準のオブジェクト (.o) ファイルで作成されます (複数のオブジェクトファイルをまとめてアーカイブファイルを作成することができます) 。静的にリンクされたコードは、システムリンカで、永続的に、システムの実行可能ファイルにリンクされます。静的リンクでは、実行時に、複数のユーザで同じアプリケーションのオブジェクトコードを共有することができます。しかし、共有ライブラリとは異なり、異なるアプリケーション間で、オブジェクトコードを共有することはできません。

システムの実行可能プログラムの起動コードは、常に静的にリンクされています。COBOL ランタイムシステムは常に動的にリンクされます。

リンク済みのプログラムを実行する場合は、UNIX のプロンプトで、プログラム名とパラメータを入力します。ただし、ライブラリへのパスは、あらかじめ設定しておく必要があります。パスは通常、次の環境変数の値として設定します。

詳細は、付録、『環境変数』を参照してください。

8.2 cob コマンドを使用したリンク

COBOL のシステム実行可能ファイルを作成する際に実行される cob の処理に関しては、『COBOL システムインターフェイス (Cob)』 の章で詳細説明しています。この項では、cob を使ってリンクする場合の最も重要なポイントに的を絞って、概要を説明します。

ソースファイル myfile.cblcob で処理される手順は次のとおりです。ファイル名は cob コマンドで -x フラグとともに入力します。

myfile.cbl-> myfile.int-> myfile.o->myfile

最後の myfile は、システムの実行可能ファイルです。詳細は、『プログラムの作成』を参照してください。

cob コマンドに -x フラグを指定すると、コマンド行に指定されたすべてのファイル、およびオプションが必要であると判断されます。cob コマンドは、複数のファイルをそれぞれのファイル名拡張子で区別し、複数のフラグやオプションを認識します。コマンドは、認識したフラグに従って、認識したファイルをそれそれの終了点に変換します。その後、システムリンカ (ld) を起動し、プログラムファイルとオプションを、cob のコマンド行に指定された順に (+l フラグ、および +L フラグを除く。詳細は、cob のフラグの説明』 の章を参照してください) リンカに渡します。システムリンカは、指定されたタイプのリンク行い、最終的なシステムの実行可能ファイルを作成します。

cob で認識できなかったファイルやフラグは、変換されずにリンカに渡されます。そのため、cob にファイルおよびフラグを指定する際には、誤りがないよう注意してください。cob では、cob 自体のファイルやフラグが認識できるかどうかを確認できません。そのため、エラーがある場合でも、フラグは立てられません。-x フラグを指定する場合は、.gntファイルや呼び出し可能な共有オブジェクトを指定しないでください。

最終的なシステムの実行可能ファイルの入口点は、デフォルトでは、cob のコマンド行に最初に入力されたファイルの基本名です。最初に指定するプログラムとしては、COBOL プログラムでも、COBOL 以外のプログラムでも指定できます。cob の -e フラグを使用して、デフォルトの入口点を変更することができます。

8.2.1 簡単なデフォルトのリンク

cob コマンドに、-x フラグを指定して、システムの実行可能アプリケーションファイルを作成することができます。この時、フラグとともに、システムの実行可能ファイルに組み込むアプリケーションファイルを列挙します。アプリケーションファイルには、COBOL、C、または C++ のソースファイルや .int ファイル、または .o タイプのオブジェクトファイルを組み込むことができます。システムの実行可能ファイルの名前は、最初に指定されたアプリケーションファイルの基本名になります。ただし、-o フラグを使って別な名前を指定すると、指定した名前にすることができます。次に例を示します。

cob -x myprog.cbl

このように入力すると、プログラム myprog.cbl はネイティブオブジェクトコードにコンパイルされます。このオプジェクトコードが、ランタイムサポートルーチンにリンクされ、システムの実行可能プログラム myprog が作成されます。コマンド行で、システムの実行可能プログラムの名前を入力すると、このプログラムを実行できます。PATH 環境変数に、カレントディレクトリを設定していない場合は、コマンド行で次のように入力すると、このプログラムを実行できます。

./myprog

作成したアプリケーションに複数のプログラムが組み込まれている場合は、すべてのプログラムを互いにリンクさせることができます。次に例を示します。

cob -xv myprog.cbl mysub.int csub.c -o myapp

コマンド行にこのように入力すると、myprog.cbl、および mysub.int は、ネイティブオブジェクトコードに変換され、C ソースファイル csub.c は、オブジェクトファイルにコンパイルされます。生成されたこれらのオブジェクトコード、およびオブジェクトファイルが、COBOL ランタイムサポートルーチンにリンクされ、システムの実行可能ファイル myapp が作成されます。-v フラグを指定すると、cob の進捗状況に関するメッセージが表示されます。

作成したアプリケーションに、C++ で記述されたコードが含まれる場合は、cob に -x,CC フラグを指定する必要があります。これにより、(システムリンカではなく) C++ コンパイラが起動され、最終的なシステムの実行可能プログラムが作成できます。次に例を示します。

cob -x,CC myprog.cbl mysub.int csub.c cppsub.C -o myapp

コマンド行にこのように入力すると、COBOL プログラム、 myprog.cbl、および mysub.int と、C ソースファイル、 csub.c 、C++ ソースファイル、 cppsub.c を使用したシステムの実行可能プログラム、 myapp が作成されます。

システムの実行可能アプリケーションファイルの最初の入口点は、デフォルトでは、コマンド行で最初に指定されたプログラムの基本名になります。前述の例では、myprog になります。アプリケーションの最初の入口点を変更する場合は、cob の -e フラグを使用します。次に例を示します。

cob -xo myapp myprog.cbl subprog.o -e myentry

このように入力すると、myentry が最初の入口点として指定されます。

アプリケーションに、共有ライブラリまたはアーカイブ (.a) ライブラリのルーチンを組み込む場合は、次の項をお読みください。

8.2.2 ライブラリファイルを使用する実行可能プログラムの作成

コマンド行で cob -x に -l フラグを使用すると、共有ライブラリファイルにリンクしたシステムの実行可能アプリケーションファイルを作成したり、アーカイブファイルを組み込んだシステムの実行可能アプリケーションファイルを作成することができます。-l フラグに関する全詳細は、cob のフラグの説明』の章を参照してください。 コマンド行は、次の形式で入力します。

cob -x filenames [-L dir] [-l name]

パラメータの内容は次の通りです。

filenames

cob コマンドに入力するファイルを列挙します。

-L path cob の -l フラグとともに指定されたライブラリが、システムリンカに検索される順番を変更します。
-l name 参照を解決するために検索するファイル名を指定します。libname.so (または libname.a) が検索されます。

これにより、すべてのアプリケーションプログラム、およびサブプログラムは、デフォルトの COBOL ランタイムシステムのライブラリ、および、オペレーティングシステムのサポートライブラリと同様に、指定されたライブラリにもリンクされます。このようにして作成されたシステムの実行可能ファイルでは、実行時に、実行が主入口点に渡る前に、指定された共有ライブラリがあらかじめロードされます。

システムの実行可能ファイルを作成する際に、共有ライブラリにある参照先モジュールのコードは、ユーザのシステムの実行可能ファイルには組み込まれません。そのかわり、このようなモジュールが実行時に参照されると、制御がそのモジュールに渡される前に、該当する共有ライブラリが、共有ライブラリファイルからメモリにロードされます。

cob コマンドでは、基本名が同じである場合は、アーカイブライブラリより共有ライブラリが優先して使用されます。 cob フラグでライブラリ名が指定されると、cob では、その名前が共有ライブラリ名と解釈されますが、指定された名前のライブラリが存在しない場合は、同じ名前のアーカイブライブラリが使用されます。

たとえば、cob のコマンド行で、abcxyz という 2 つのライブラリを指定する場合は、次のように入力します。

cob -x prog.cbl -labc -lxyz

ライブラリ、 libxyz.solibxyz.a、および libabc.a が存在する場合に、参照解決のために検索されるのは、libxyz.so、および libabc.a のみです。libxyz.a は検索されません。

共有ライブラリファイル内のサブプログラムが参照されている場合は、ライブラリ全体がリンクされます。これに対し、アーカイブライブラリ内のサブプログラムが参照されている場合は、参照されているサブプログラムのみがリンクされます。そのため、共有ライブラリファイルのサブプログラムは、参照されていないものでも Dynamic Loader で使用できますが、アーカイブライブラリのものは使用できません。

8.2.3 共有ライブラリの作成

共有ライブラリは、cob -z コマンドを使用して作成します。

共有ライブラリは直接実行することができないため、これらをシステムの実行可能プログラム、または呼び出し可能な共有オブジェクトにリンクする必要があります。このため、共有ライブラリは、リンクプロセスでシステムリンカによって検索されます。つまり、共有ライブラリ名には必ずプリフィックス lib と拡張子 .so (HP-UX PA-RISC の場合は .sl)を付ける必要があります。

cob に -o フラグを指定しない場合は、coblibname.so (HP-UX PA-RISC の場合は libname.sl ) という名前の共有ライブラリが作成されます。 namecob に最初に指定されたアプリケーションの基本名になります。 次に例を示します。

cob -Z myprog.cbl

このように入力すると、プログラム、 myprog.cbl がネイティブオブジェクトコードにコンパイルされます。このオブジェクトコードがリンクされ、共有ライブラリ、 libmyprog.so が作成されます。

共有ライブラリは、COBOL、C、および C++ のソースファイル、.int ファイル、または様々なタイプの .o ファイルを組み合わせて作成することができます。次に例を示します。

cob -Z myprog.cbl mysub.int csub.c -o libmyapp.so

このように入力すると、COBOL プログラム、 myprog.cbl および mysub.int がネイティブオブジェクトコードにコンパイルされ、C ソースファイル、 mysub.c は、オブジェクトファイルにコンパイルされます。生成されたこれらのオブジェクトコード、およびオブジェクトファイルが互いにリンクされ、共有ライブラリ、 libmyapp.soが作成されます。

共有ライブラリにリンクさせる C++ コードがある場合は、cob に -Z,CC フラグを指定する必要があります。これにより、(システムリンカではなく) C++ コンパイラが起動され、共有ライブラリファイルが作成されます。 次に例を示します。

cob -Z,CC myprog.cbl mysub.int csub.c cppsub.C

このように入力すると、COBOL プログラム、 myprog.cbl および mysub.int と、C ソースファイル、 csub.c、C++ ソースファイル、 cppsub.C を使用した、共有ライブラリ、 libmyprog.so が作成されます。

8.2.4 実行可能プログラム RTS の作成

実行可能プログラム RTS はシステムの実行可能ファイルで、実行時に最初の入口点を指定する必要があります。Object COBOL V4.1 以前では、ユーザプログラムに C および C++ プログラムをリンクする場合は実行可能プログラム RTS が必要でした。しかし、現在は C および C++ プログラムを、呼び出し可能な共有オブジェクトに入れることができるため、このような目的で、実行可能プログラム RTS を作成する必要はありません。詳細は、『呼び出し可能な共有オブジェクト』の章を参照してください。

実行可能プログラム、 RTS は、cob を使用して作成することができます。次に例を示します。

cob -xo rts.new subprogs.c -e ""

このように指定すると、デフォルトのランタイムシステム ($COBDIR/bin/rts32 または $COBDIR/bin/rts32_t) と同レベルの機能を持つ実行可能プログラム RTS を作成することができます。この RTS プログラムには、subprogs.c ファイル内の C のサブルーチンも組み込まれます。そのため、実行時にコマンド行で次のように入力すると、動的にロード可能なプログラム myapp を実行することができます。

./rts.new myapp

cob-e "" オプションを指定してビルドしたシステムの実行可能プログラムは、実行時に実行可能ファイルの入口点の指定が必要となります。

cob の -e フラグに関する全詳細は、cob のフラグの説明』の章を参照してください。

8.2.5 動的ロード

UNIX では通常、呼び出されるすべてのプログラムの名前とその実体が、リンク時に必要となります。COBOL システムでは、呼び出し可能な共有オブジェクト、.int ファイル、および .gnt ファイルが動的に読み込まれるため、COBOL プログラムに対してこのような条件はありません。

COBOL システムを使用すると、プログラムの呼び出しを、それぞれのプログラムに直接リンクさせる (呼び出されるプログラムがリンク時に使用可能の場合) こともできますが、Dynamic Loader にリンクさせることもできます。Dynamic Loader は、実行時に指定されたプログラムを検索し、必要であれば、そのプログラムを動的にロードします。

動的ロードに関する詳細は、『アプリケーションのパッケージ化』の章の『動的ロード』 の項を参照してください。

8.2.5.1 Dynamic Loader を使用した実行可能プログラムの作成

Dynamic Loader を使用すると、呼び出し可能な形式のファイルを、実行時に動的にロードすることができます。詳細は、『アプリケーションのパッケージ化』の章を参照してください。

Object COBOL V4.1 以前では、Dynamic Loader は、プログラム中で使用される CALL 文の形式に従って、システムの実行可能プログラムに自動的にリンクされました。Server Express では Dynamic Loader は常に組み込まれています。

Dynamic Loader は、cob にフラグを使用して、次のようなシステムの実行可能プログラムをビルドする場合にも選択されます。

cob-d symb オプションを指定してビルドしたシステムの実行可能プログラムでは、symb に指定したプログラムが実行時に呼び出された場合に、このプログラムが動的にロードされます。また、このプログラムを静的にリンクするプログラムとして cob に指定すると、cob からエラーが出力されます。

cob に -e"" フラグを指定してビルドしたシステムの実行可能プログラムは、実行時に実行可能ファイルの入口点の指定が必要となります。入口点は、実行時にコマンド行で入口点名を入力して指定します。指定されたプログラムの検索には、Dynamic Loader が使用されます。Dynamic Loader では、指定されたプログラムがリンクされているか、または既にロード済みであるかが確認され、リンクもロードもされていない場合は、プログラムが動的にロードされます。

-d フラグおよび -e フラグに関する全詳細は、『cob のフラグの説明』で説明しています。

CALL データ名文および ON EXCEPTION 句が含まれる CALL 文では、暗黙的に Dynamic Loader が使用されます。しかし、たとえば、呼び出されるサブプログラムが C のルーチンである場合など、動的にロードしたくない場合もあります。サブプログラムが Dynamic Loader を使って呼び出された場合でも、そのサブプログラムがシステムの実行可能ファイルリンクされていれば、実行時にはリンクされているバージョンが使用され、このサブプログラムは動的にロードされません。

アーカイブライブラリにサブプログラムがあり、このサブプログラムを動的にロードしたくない場合は、次のいずれかの方法でプログラムをリンクしてください。

これ以外に、cob に -Z フラグを使用して、アーカイブライブラリを共有ライブラリに変える方法もあります。

8.2.5.2 未解決の参照の解決

CALL "literal" という形式の COBOL 構文を使用すると、literal が直接参照されます。

システムの実行可能プログラムを作成する場合に、プログラムのリンク時に入口点、 literal が指定された場合のみ、このような参照すべてが確実に結び付けられます。入口点、 literal が指定されないと、literal への参照は解決されず、リンクエラーになります。

未解決の参照は cob -d symb を使用すると解決できます。このように指定してビルドしたシステムの実行可能プログラムでは、symb は実行時に動的にロードされます。

次に例を示します。

cob -x myprog.cbl subprog.cbl -d myref

このように指定すると、指定した COBOL プログラムのどちらかにある myref への参照が解決されます。実行時に myref が呼び出されると、Dynamic Loader が起動され、myref への呼び出しが検索されてロードされます。

未解決の参照が複数ある場合は、cob の -U オプションを使用すると、これらすべてを一度に解決することができます。次に例を示します。

cob -x myprog.cbl subprog.cbl -U

このように指定すると、すべての未解決の参照が解決された状態で、myprog が作成されます。

8.2.5.3 動的にロード可能なファイルの作成

動的にロード可能なファイルは、.int ファイル、.gnt ファイル、または呼び出し可能な共有オブジェクトとして、COBOL ソースファイルから作成できます。詳細は、『プログラムの作成』の章および『呼び出し可能な共有オブジェクト』の章を参照してください。

cob コマンドのデフォルトでは、.int ファイルが作成されます。次に例を示します。

cob filenames

-u フラグを次のように使用すると、.gnt ファイルを作成することができます。

cob -u filenames

filenames の部分には、cob コマンドに入力する COBOL ファイルを列挙します。

-z フラグを次のように使用すると、呼び出し可能な共有オブジェクトを作成することができます。

cob -z filenames

filenames の部分には、cob コマンドに入力する COBOL ファイルを列挙します。

動的にロード可能なファイルを実行するには、これらを実行可能プログラム RTS、または実行可能アプリケーションから呼び出す必要があります。便利な方法として、cobrun コマンドを使用する方法があります (詳細は、『実行』 の章を参照してください)。

次に、cob の-d オプションの使用例を示します。この例でビルドされるシステムの実行可能ファイルは、メインプログラム prog がリンクされ、実行時に副プログラム subprog が動的にロードされます。

cob -x prog.cbl -d subprog

subprog から、動的にロード可能なファイルを高性能マシン用のコードとして作成する場合は、 コマンド行で次のように入力します。

cob -z subprog.cbl

プログラム prog を実行するには、

実行時にシステムの実行可能ファイル
prog
を起動します。

副プログラムが呼び出されると Dynamic Loader でロードされます。副プログラムが検出されず、ロードできない場合は、呼び出した CALL 文に ON EXCEPTION 句があればこの句が実行され、この句がない場合は、ランタイムシステムでエラーになります。


注 : コマンド行にファイル名のみを指定して、システムの実行可能ファイルが実行できるようにするには、指定するファイルを PATH 環境変数に指定したディレクトリに置く必要があります。それ以外のディレクトリに置いた場合は、完全パス名を指定します。たとえば、上記の例では次のように指定します。

. /prog
      


次の例では、2 つのプログラムが組み込まれ、実行時にどちらのプログラムを実行するかを選択できる、実行可能プログラム RTS をビルドする方法を示します (詳細は、『実行可能プログラム RTS の作成』 の章を参照してください)。cob のオプション -e "" を使用して、入口点またはメインのプログラムを実行時に指定できるようにします。-o オプションで、システムの実行可能ファイルの名前 runprog を指定します。

cob -xe "" prog1.cbl prog2.cbl -o runprog

このように指定すると、両方のプログラムからリンクされたシステムの実行可能ファイル runprog が作成されます。最初のプログラムを実行するには、コマンド行で次のように入力します。

runprog prog1

2 番目のプログラムを実行するには、コマンド行で次のように入力します。

runprog prog2


 
  

Copyright © 2005 Micro Focus International Limited. All rights reserved.