–B nodirect オプションは、どの動的オブジェクトからの直接結合も回避する、もっとも簡単なメカニズムを提供します。このオプションはほかのオブジェクトから、また作成中のオブジェクト内からの直接結合を回避します。
次のコンポーネントを使用して、3 つの共有オブジェクト、A.so.1、O.so.1、およびX.so.1 を作成します。–B nodirect オプションを使用すると、A.so.1 は O.so.1 に直接結合されません。しかし、O.so.1 は、–z direct オプションを使用して X.so.1 への直接結合を引き続き確立できます。
$ cat a.c extern int o(), p(), x(), y(); int a() { return (o() + p() - x() - y()); } $ cat o.c extern int x(), y(); int o() { return (x()); } int p() { return (y()); } $ cat x.c int x() { return (1); } int y() { return (2); } $ cc -o X.so.1 -G -Kpic x.c $ cc -o O.so.1 -G -Kpic o.c -Bnodirect -zdirect -R. X.so.1 $ cc -o A.so.1 -G -Kpic a.c -Bdirect -R. O.so.1 X.so.1
A.so.1 および O.so.1 のシンボル情報は、elfdump(1) で参照できます。
$ elfdump -y A.so.1 [1] DBL [3] X.so.1 x [5] DBL [3] X.so.1 y [6] DL [1] O.so.1 o [9] DL [1] O.so.1 p $ elfdump -y O.so.1 [3] DB [0] X.so.1 x [4] DB [0] X.so.1 y [6] N o [7] N p
文字「N」は、関数 o() および p() に直接結合が許可されていないことを示しています。A.so.1 が –B direct オプションによって直接結合を要求したとしても、関数 o() および p() に直接結合は確立されません。O.so.1 は引き続き、–z direct オプションを使用して依存関係 X.so.1 への直接結合を要求できます。
Oracle Solaris ライブラリ libproc.so.1 は、–B nodirect オプションを使って作成されます。このライブラリのユーザーは、多くの libproc 関数に対して独自のコールバックインタフェースを用意することが求められています。libproc の依存関係から libproc 関数への参照は、いずれかのユーザー定義 (このような定義がある場合) に結合する必要があります。