未解決の参照の解決

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 が作成されます。