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オプションを指定する必要があります。
-
動的なリンクによって,ほかのプログラムを呼び出す場合
-
一意名指定の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コマンドのオプションの詳細は,システムのマニュアルを参照してください。
-
ccコマンドの場合:-m32オプション
-
ldコマンドの場合:-melf_i386オプション