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

印刷ビューの終了

更新: 2014 年 7 月
 
 

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

–B nodirect オプションは、どの動的オブジェクトからの直接結合も回避する、もっとも簡単なメカニズムを提供します。このオプションはほかのオブジェクトから、また作成中のオブジェクト内からの直接結合を回避します。

次のコンポーネントを使用して、3 つの共有オブジェクト、A.so.1O.so.1、およびX.so.1 を作成します。–B nodirect オプションを使用すると、A.so.1O.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 関数への参照は、いずれかのユーザー定義 (このような定義がある場合) に結合する必要があります。