Oracle® Solaris 11.2 リンカーとライブラリガイド

印刷ビューの終了

更新: 2014 年 7 月
 
 

–B direct オプションの使用方法

–B direct オプションは、どの動的オブジェクトに対しても直接結合を有効にする、もっとも簡単なメカニズムを提供します。このオプションは、どの依存関係にも、また作成中のオブジェクト内に、直接結合を確立します。

前の例で使用されたコンポーネントから、直接結合されたオブジェクトである W.so.2 を作成できます。

$ cc -o W.so.2 -G -Kpic W.c -R. -Bdirect w.so.1
$ cc -o prog2 -R. main.c W.so.2 X.so.1

直接結合の情報は、W.so.2 内にあるシンボル情報セクション (.SUNW_syminfo) に保持されます。このセクションは elfdump(1) を使用すると参照できます。

$ elfdump -y W.so.2
     [6]  DB          <self>         a
     [7]  DBL     [1] w.so.1         b

文字「DB」は、関連シンボルに対する直接結合が記録されたことを示しています。関数 a() は、格納するオブジェクト W.so.2 に結合されています。関数 b() は、依存関係 w.so.1 に直接結合されています。文字「L」は、依存関係 w.so.1 が遅延読み込みされることも示しています。

W.so.2 に確立された直接結合は、LD_DEBUG 環境を使用すると確認できます。detail トークンは追加情報を結合診断に追加します。W.so.2 の場合、このトークンは結合が直接的であることを示します。detail トークンは、結合アドレスに関する追加情報も提供します。単純化するため、このアドレス情報は、次の例から生成される出力から省略されました。

$ LD_DEBUG=symbols,bindings,detail  prog2
....
18452: symbol=a;  lookup in file=./W.so.2  [ ELF ]
18452: binding file=./W.so.2 to file=./W.so.2: symbol 'a'  (direct)
18452: symbol=b;  lookup in file=./w.so.1  [ ELF ]
18452: binding file=./W.so.2 to file=./w.so.1: symbol 'b'  (direct)

lari(1) ユーティリティーは直接結合情報を表示することもできます。

$ lari prog2
[2:2ESD]: a(): ./W.so.2
[2:0]: a(): ./X.so.1
[2:2ED]: b(): ./w.so.1
[2:0]: b(): ./x.so.1

文字「D」は、W.so.2 によって定義された関数 a() が直接結合されていることを示しています。同様に、w.so.1 で定義された関数 b() は直接結合されています。


注 -  関数 a()W.so.2W.so.2 に直接結合すると、W.so.2 を構築するときに –B symbolic オプションを使用した場合と類似の効果が生まれます。ただし、–B symbolic オプションでは、内部的に解決できる a() などの参照がリンク編集時に終了処理されることになります。このシンボルの解決では、実行時に解決する結合が残りません。

–B symbolic 結合とは異なり、–B direct では実行時に解決する結合が残ります。このため、この結合は明示的な割り込みによってオーバーライドしたり、環境変数 LD_NODIRECT を非ヌル値に設定することによって無効化したりできます。

複雑なオブジェクトを読み込むときに発生する実行時再配置のオーバーヘッドを削減するために、多くの場合、シンボリック結合が採用されてきました。直接結合は、まったく同じシンボル結合を確立するために使用できます。ただし、各直接結合を作成するために実行時再配置が引き続き必要です。直接結合にはシンボリック結合より多くのオーバーヘッドが発生しますが、柔軟性は向上します。