未解決の参照の解決

LITLINK コンパイラ指令を指定してコンパイルしたプログラムを、COBOL 文、CALL "literal" を使用して呼び出すと、literal への直接参照が実行されます。このような参照は、同じ名前の入口点に確実に結び付けられます。 この入口点は、呼び出し可能な共有オブジェクトを作成する際に、cob 行で指定されたプログラム内に定義されています。直接参照先の名前に相当する入口点名が、呼び出し可能な共有オブジェクトの作成時に指定されたプログラムのいずれにも存在しない場合は、この参照を未解決の参照と呼びます。

呼び出し可能な共有オブジェクトが実行時にロードされると、オペレーティング システムの動的リンカーですべての未解決の参照が解決されます。 この時、システムの実行可能ファイルのシンボル、ロード済みの共有ライブラリ、およびロード済みの呼び出し可能な共有オブジェクトがリンカーで使用されます。解決されないシンボルがあると、呼び出し可能な共有オブジェクトはロードされず、ロード エラーになります。プラットフォームによっては、未解決のシンボルの名前が一覧表示されるものもあります。

ロード エラーを防ぐには、呼び出し可能な共有オブジェクトを作成する際に、すべての未解決の参照を解決する必要があります。これには cob で -d または -U オプションを使用します。

未解決の参照の名前が解っている場合は、-d オプションを使用して解決できます。たとえば、次のコマンドは、指定された COBOL プログラムのいずれかで myref への参照を解決します。実行時に呼び出されると、myref は、標準の検索規則に従って動的にロードされます。 標準の検索規則では、まず、現在ロード済みのエントリ ポイントで myref が検索され、検出されなければ、次にディスク上で myref (myref.so など) が検索されます。

cob -z myprog.cbl subprog.cbl entry.cbl -d myref

すべての未解決の参照を一覧表示するには、呼び出し可能な共有オブジェクトを作成する際に、cob の -z,U オプションを使用します。たとえば、次のコマンドは、myprog.so を作成し、未解決の参照を一覧表示します。

cob -z,U myprog.cbl subprog.cbl entry.cbl

cob に -d オプションも追加すると、参照を解決することができます。ただし、シンボルが呼び出し側のシステムの実行可能プログラムにリンクされることが解っている場合 (cobrun または cobrun_t を使用しない場合) や、シンボルが定義されている呼び出し可能な共有オブジェクトがすでにロード済みであることが解っている場合は、これらのシンボルに対して -d オプションを使用する必要はありません。

すべての未解決の参照を解決するには、cob で -U オプションを使用します。たとえば、次のコマンドは、myprog.so を作成し、未解決の参照をすべて解決します。

cob -z myprog.cbl subprog.cbl entry.cbl -U