–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() は直接結合されています。
–B symbolic 結合とは異なり、–B direct では実行時に解決する結合が残ります。このため、この結合は明示的な割り込みによってオーバーライドしたり、環境変数 LD_NODIRECT を非ヌル値に設定することによって無効化したりできます。
複雑なオブジェクトを読み込むときに発生する実行時再配置のオーバーヘッドを削減するために、多くの場合、シンボリック結合が採用されてきました。直接結合は、まったく同じシンボル結合を確立するために使用できます。ただし、各直接結合を作成するために実行時再配置が引き続き必要です。直接結合にはシンボリック結合より多くのオーバーヘッドが発生しますが、柔軟性は向上します。