共用ライブラリとは,副プログラムだけで構成され,実行可能ファイル中のプログラムから呼ばれることで実行できるファイルのことです。ここでは,次に示すファイルを共用ライブラリと呼びます。
システム名 | 共用ライブラリ |
---|---|
HP-UX(IPF) HP-UX(IPF64) | xxx.so xxx.sl |
AIX(32) AIX(64) | xxx.a xxx.so※ |
Solaris(SPARC) | xxx.so |
Linux | xxx.so |
共用ライブラリを作成する方法は,実行可能ファイルの生成と同じです。ここでは,共用ライブラリの作成方法のうち,実行可能ファイルの生成と異なる部分について説明します。
ccbl2002コマンドでCOBOLプログラムから共用ライブラリを作成する場合は,-PIC,Stdオプションを指定します。コンパイルとリンクを別々にccbl2002コマンドで行う場合は,コンパイル時,リンク時,共に-PIC,Stdオプションを指定します。
次に,共用ライブラリを作成する例を示します。
IDENTIFICATION DIVISION.
PROGRAM-ID. TEST02.
PROCEDURE DIVISION.
DISPLAY '--- TEST02 START ---'.
DISPLAY '--- TEST02 END ---'.
ccbl2002 -PIC,Std test02.cbl
ld -b -o test02.so test02.o -a archive
-L/opt/HILNGcbl2k/lib -lcbl2kml
ccbl2002 -PIC,Std test02.cbl
ld -b -o test02.so test02.o -a archive
-L/opt/HILNGcbl2k64/lib -lcbl2kml
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
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
ccbl2002 -PIC,Std test02.cbl
ld -G -o test02.so test02.o -Bstatic
-L/opt/HILNGcbl2k/lib -lcbl2kml -Bdynamic -lc
ccbl2002 -PIC,Std -UniObjGen test02.cbl
ld -shared -o test02.so test02.o -Bstatic
-L/opt/HILNGcbl2k/lib -lcbl2kml -Bdynamic -lc
ccbl2002 -PIC,Std -UniobjGen test02.cbl
ld -shared -o test02.so test02.o -Bstatic
-L/opt/HILNGcbl2k64/lib -lcbl2kml -Bdynamic -lc
ccbl2002 -PIC,Std test02.cbl
ld -shared -o test02.so test02.o -Bstatic
-L/opt/HILNGcbl2k/lib -lcbl2kml -Bdynamic -lc
AIX(32)またはAIX(64)の場合,arコマンドを使用してアーカイブ形式の共用ライブラリを作成できます。
アーカイブ形式の共用ライブラリにした場合,動的なリンクによって,アーカイブ形式の共用ライブラリ中のプログラムを呼び出せます。詳細については,「18. プログラムの呼び出し」を参照してください。
また,arコマンドについては,システムのマニュアルを参照してください。
(1)の共用ライブラリ"test02.a"と,別の共用ライブラリ"test03.a"をアーカイブ形式の共用ライブラリにまとめる場合の例を示します。
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 -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
共用ライブラリに含まれるプログラム(副プログラム)からほかのプログラムを呼び出すとき,次の条件に当てはまる場合は,コンパイル時に-DynamicLink,Callオプションを指定する必要があります。
ほかのプログラムを呼ぶ副プログラムの作成例を,次に示します。
ccbl2002 -PIC,Std -DynamicLink,Call test01.cbl test02.cbl
ld -b -o test01.so test01.o -a archive
-L/opt/HILNGcbl2k/lib -lcbl2kml -a default -lelf
ld -b -o test02.so test02.o -a archive
-L/opt/HILNGcbl2k/lib -lcbl2kml -a default -lelf
ccbl2002 -PIC,Std -DynamicLink,Call test01.cbl test02.cbl
ld -b -o test01.so test01.o -a archive
-L/opt/HILNGcbl2k64/lib -lcbl2kml -a default -lelf
ld -b -o test02.so test02.o -a archive
-L/opt/HILNGcbl2k64/lib -lcbl2kml -a default -lelf
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
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
ccbl2002 -PIC,Std -DynamicLink,Call test01.cbl test02.cbl
ld -G -o test01.so test01.o -Bstatic
-L/opt/HILNGcbl2k/lib -lcbl2kml -Bdynamic -lc
ld -G -o test02.so test02.o -Bstatic
-L/opt/HILNGcbl2k/lib -lcbl2kml -Bdynamic -lc
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
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
ccbl2002 -PIC,Std -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
cc -c test01.c
ld -b -o test01.so test01.o
cc -c test01.c +DD64
ld -b -o test01.so test01.o
cc -c test01.c
cc -G -o test01.a test01.o
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
cc -c test01.c -q64
cc -G -o test01.a test01.o -q64
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
cc -xcode=pic13 -c test01.c
ld -G -o test01.so test01.o -lc
cc -fpic -c test01.c
ld -shared -o test01.so test01.o -lc
Linux(x86) COBOL2002で生成したオブジェクトを,ccコマンドまたはldコマンドを使用してリンクする場合,32bitアプリケーションとしてリンクしなければなりません。x64向けLinux環境では,それぞれ次のオプションの指定が必要です。なお,ccコマンドおよびldコマンドのオプションの詳細は,システムのマニュアルを参照してください。