–z direct オプションを使用すると、リンク編集コマンド行のオプションに従うどのような依存関係に対しても直接結合を確立できるメカニズムが提供されます。–B direct オプションとは異なり、構築中のオブジェクト内に、直接結合は確立されません。
このオプションは、割り込まれるように設計されたオブジェクトを作成する場合に適しています。たとえば、共有オブジェクトは、いくつかのデフォルト (フォールバック) インタフェースを持つように設計される場合があります。アプリケーションは、アプリケーション定義を実行時に結合するために、自由にこれらのインタフェースを独自に定義できます。アプリケーションが共有オブジェクトのインタフェースに割り込めるようにするには、–B direct オプションではなく、–z direct オプションを使用して共有オブジェクトを作成します。
–z direct オプションは、1 つまたは複数の依存関係に対する直接結合を選択する場合にも有効です。–z nodirect オプションを使用すると、リンク編集で指定される依存関係の間で、直接結合の使用を切り替えることができます。
前の例で使用されたコンポーネントから、直接結合されたオブジェクトである X.so.2 を作成できます。
$ cc -o X.so.2 -G -Kpic X.c -R. -zdirect x.so.1 $ cc -o prog3 -R. main.c W.so.2 X.so.2
直接結合情報は、elfdump(1) で表示できます。
$ elfdump -y X.so.2 [6] D <self> a [7] DB [1] x.so.1 b
関数 b() は、依存関係 x.so.1 に直接結合されています。関数 a() は、オブジェクト X.so.2 と潜在的な直接結合 (「 D」) を持つように定義されていますが、直接結合は確立されません。
実行時の結合を確認するために、LD_DEBUG 環境変数を使用できます。
$ LD_DEBUG=symbols,bindings,detail prog3 .... 06177: symbol=a; lookup in file=prog3 [ ELF ] 06177: symbol=a; lookup in file=./W.so.2 [ ELF ] 06177: binding file=./X.so.2 to file=./W.so.2: symbol 'a' 06177: symbol=b; lookup in file=./x.so.1 [ ELF ] 06177: binding file=./X.so.2 to file=./x.so.1: symbol 'b' (direct)
lari(1) ユーティリティーは直接結合情報を表示することもできます。
$ lari prog3 [2:2ESD]: a(): ./W.so.2 [2:0]: a(): ./X.so.2 [2:1ED]: b(): ./w.so.1 [2:1ED]: b(): ./x.so.1
W.so.2 で定義された関数 a() は、X.so.2 で作成されたデフォルトのシンボル参照を引き続き満たします。しかし、x.so.1 で定義された関数 b() は、X.so.2 で作成された参照から直接結合されています。