COBOL2002 使用の手引 手引編


34.2.1 共用ライブラリの作成

共用ライブラリとは,副プログラムだけで構成され,実行可能ファイル中のプログラムから呼ばれることで実行できるファイルのことです。ここでは,次に示すファイルを共用ライブラリと呼びます。

システム名

共用ライブラリ

AIX

xxx.a

xxx.so

Linux

xxx.so

注※

xxx.soライブラリを,リンク時に-lオプションで指定する場合は,-brtlオプションの指定が必要です。-brtlオプションの詳細については,システムのマニュアルを参照してください。

共用ライブラリを作成する方法は,実行可能ファイルの生成と同じです。ここでは,共用ライブラリの作成方法のうち,実行可能ファイルの生成と異なる部分について説明します。

〈この項の構成〉

(1) 共用ライブラリを作成する

ccbl2002コマンドでCOBOLプログラムから共用ライブラリを作成する場合は,-PIC,Stdオプションを指定します。

共用ライブラリを作成する例を次に示します。

ソースファイル名称:test02.cbl
       IDENTIFICATION DIVISION.
       PROGRAM-ID. TEST02.
       PROCEDURE DIVISION.
           DISPLAY '--- TEST02  START ---'.
           DISPLAY '--- TEST02    END ---'.
ccbl2002コマンドの指定
AIX(32)の場合
ccbl2002 -PIC,Std  test02.cbl
ld -o test02.a test02.o -bpT:0x10000000 -bpD:0x20000000
   -bnoentry -bM:SRE -bexpall
   -L/opt/HILNGcbl2k/lib -lcbl2k -lcbl2kml -lm -lc

上記のコマンドを実行すると,共用ライブラリ"test02.a"が生成されます。

AIX(64)の場合
ccbl2002 -PIC,Std  test02.cbl
ld -o test02.a test02.o -b64 -bpT:0x100000000 -bpD:0x110000000
   -bnoentry -bM:SRE -bexpall
   -L/opt/HILNGcbl2k64/lib -lcbl2k64 -lcbl2kml64 -lm -lc

上記のコマンドを実行すると,共用ライブラリ"test02.a"が生成されます。

Linux(x86)の場合
ccbl2002 -PIC,Std -UniObjGen test02.cbl
ld -shared -o test02.so test02.o -Bstatic
   -L/opt/HILNGcbl2k/lib -lcbl2kml -Bdynamic -lc

上記のコマンドを実行すると,共用ライブラリ"test02.so"が生成されます。

Linux(x64)の場合
ccbl2002 -PIC,Std -UniobjGen test02.cbl
ld -shared -o test02.so test02.o -Bstatic
   -L/opt/HILNGcbl2k64/lib -lcbl2kml -Bdynamic -lc

上記のコマンドを実行すると,共用ライブラリ"test02.so"が生成されます。

(2) アーカイブ形式の共用ライブラリを作成する

AIXの場合,arコマンドを使用してアーカイブ形式の共用ライブラリを作成できます。

アーカイブ形式の共用ライブラリにした場合,動的なリンクによって,アーカイブ形式の共用ライブラリ中のプログラムを呼び出せます。詳細については,「18 プログラムの呼び出し」を参照してください。

また,arコマンドについては,システムのマニュアルを参照してください。

(1)の共用ライブラリ"test02.a"と,別の共用ライブラリ"test03.a"をアーカイブ形式の共用ライブラリにまとめる場合の例を示します。

ソースファイル名称:test03.cbl
       IDENTIFICATION DIVISION.
       PROGRAM-ID. TEST03.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
         01 DAT1   PIC X(10).
       PROCEDURE DIVISION.
           MOVE ALL 'A' TO DAT1.
           DISPLAY DAT1.
ccbl2002コマンドおよびarコマンドの指定
ccbl2002 -PIC,Std  test03.cbl
ld -o test03.a test03.o -bpT:0x10000000 -bpD:0x20000000
   -bnoentry -bM:SRE -bexpall
   -L/opt/HILNGcbl2k/lib -lcbl2k -lcbl2kml -lm -lc
ar rv libSUB.a test02.a test03.a

(3) ほかのプログラムを呼ぶ副プログラムを作成する

共用ライブラリに含まれるプログラム(副プログラム)からほかのプログラムを呼び出すとき,次の条件に当てはまる場合は,コンパイル時に-DynamicLink,Callオプションを指定する必要があります。

ほかのプログラムを呼ぶ副プログラムの作成例を,次に示します。

副プログラムがCOBOLプログラムの場合

"test01.cbl"から"test02.cbl"を呼び出す場合の例を示します。

AIX(32)の場合
ccbl2002 -PIC,Std -DynamicLink,Call test01.cbl test02.cbl
ld -o test01.a test01.o -bpT:0x10000000
   -bpD:0x20000000 -bnoentry -bM:SRE
   -bexpall -L/opt/HILNGcbl2k/lib
   -lcbl2k -lcbl2kml -lm -lc
ld -o test02.a test02.o -bpT:0x10000000
   -bpD:0x20000000 -bnoentry -bM:SRE
   -bexpall -L/opt/HILNGcbl2k/lib
   -lcbl2k -lcbl2kml -lm -lc
AIX(64)の場合
ccbl2002 -PIC,Std -DynamicLink,Call test01.cbl test02.cbl
ld -o test01.a test01.o -b64 -bpT:0x100000000
   -bpD:0x110000000 -bnoentry -bM:SRE
   -bexpall -L/opt/HILNGcbl2k64/lib
   -lcbl2k64 -lcbl2kml64 -lm -lc
ld -o test02.a test02.o -b64 -bpT:0x100000000
   -bpD:0x110000000 -bnoentry -bM:SRE
   -bexpall -L/opt/HILNGcbl2k64/lib
   -lcbl2k64 -lcbl2kml64 -lm -lc
Linux(x86)の場合
ccbl2002 -PIC,Std -UniObjGen -DynamicLink,Call test01.cbl test02.cbl
ld -shared -o test01.so test01.o -Bstatic
   -L/opt/HILNGcbl2k/lib -lcbl2kml -Bdynamic -lc
ld -shared -o test02.so test02.o -Bstatic
   -L/opt/HILNGcbl2k/lib -lcbl2kml -Bdynamic -lc
Linux(x64)の場合
ccbl2002 -PIC,Std -UniObjGen -DynamicLink,Call test01.cbl test02.cbl
ld -shared -o test01.so test01.o -Bstatic
   -L/opt/HILNGcbl2k64/lib -lcbl2kml -Bdynamic -lc
ld -shared -o test02.so test02.o -Bstatic
   -L/opt/HILNGcbl2k64/lib -lcbl2kml -Bdynamic -lc
注意事項
  • コンパイルするとき,-DynamicLink,Callオプションを指定しないで,別コンパイルすることもできます。

  • オブジェクトファイルは,一つの共用ライブラリにまとめることもできます。

副プログラム"test01.c"から共用ライブラリを作成する場合

副プログラム"test01.c"を作成する場合の例を示します。

AIX(32)の場合
cc -c test01.c
cc -G -o test01.a test01.o

・Cプログラムで作成した共用ライブラリ(test01.a)とCOBOLプログラムで作成した共用ライブラリ(test02.a)をアーカイブ形式の共用ライブラリにまとめることもできます。

    ccbl2002 -PIC,Std test02.cbl
    ld -o test02.a test02.o -bpT:0x10000000
       -bpD:0x20000000 -bnoentry -bM:SRE
       -bexpall -L/opt/HILNGcbl2k/lib
       -lcbl2k -lcbl2kml -lm -lc
 
    ar rv libSUB2.a test01.a test02.a

アーカイブ形式の共用ライブラリにした場合,動的なリンクによって,アーカイブ形式の共用ライブラリ中のプログラムを呼び出せます。詳細については,「18 プログラムの呼び出し」を参照してください。

また,arコマンドについては,システムのマニュアルを参照してください。

AIX(64)の場合
cc -c test01.c -q64
cc -G -o test01.a test01.o -q64

・Cプログラムで作成した共用ライブラリ(test01.a)とCOBOLプログラムで作成した共用ライブラリ(test02.a)をアーカイブ形式の共用ライブラリにまとめることもできます。

    ccbl2002 -PIC,Std test02.cbl
    ld -o test02.a test02.o -b64 -bpT:0x100000000
       -bpD:0x110000000 -bnoentry -bM:SRE
       -bexpall -L/opt/HILNGcbl2k64/lib
       -lcbl2k64 -lcbl2kml64 -lm -lc
 
    ar -X64 rv libSUB2.a test01.a test02.a

アーカイブ形式の共用ライブラリにした場合,動的なリンクによって,アーカイブ形式の共用ライブラリ中のプログラムを呼び出せます。詳細については,「18 プログラムの呼び出し」を参照してください。

また,arコマンドについては,システムのマニュアルを参照してください。

Linuxの場合
cc -fpic -c test01.c
ld -shared -o test01.so test01.o -lc

(4) 注意事項

Linux(x86) COBOL2002で生成したオブジェクトを,ccコマンドまたはldコマンドを使用してリンクする場合,32bitアプリケーションとしてリンクしなければなりません。OSがLinux(x64)の場合は,それぞれ次のオプションの指定が必要です。なお,ccコマンドおよびldコマンドのオプションの詳細は,システムのマニュアルを参照してください。