NODIRECT mapfile キーワードは、個々のシンボルへの直接結合を回避する手段を提供します。このキーワードは、–B nodirect オプションよりも詳細に直接結合の回避を制御できます。
前の例で使用されたコンポーネントから、O.so.2 は、関数 o() に直接接続しないように作成できます。
$ cat mapfile $mapfile_version 2 SYMBOL_SCOPE { global: o { FLAGS = NODIRECT }; }; $ cc -o O.so.2 -G -Kpic o.c -Mmapfile -zdirect -R. X.so.1 $ cc -o A.so.2 -G -Kpic a.c -Bdirect -R. O.so.2 X.so.1
A.so.2 および O.so.2 のシンボル情報は、elfdump(1) で参照できます。
$ elfdump -y A.so.2 [1] DBL [3] X.so.1 x [5] DBL [3] X.so.1 y [6] DL [1] O.so.1 o [9] DBL [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] D <self> p
O.so.1 は、関数 o() が直接結合できないことを宣言するだけです。このため A.so.2 は、O.so.1 内の関数 p() に直接結合できます。
Oracle Solaris ライブラリ内にあるいくつかの個別インタフェースは、直接結合できないように定義されています。データ項目 errno はその 1 例です。このデータ項目は libc.so.1 で定義されています。このデータ項目は、ヘッダーファイル stdio.h をインクルードすることで参照できます。しかし、多くのアプリケーションでは独自の errno を定義するように指導されているのが一般的でした。libc.so.1 で定義された errno に直接結合するシステムライブラリファミリが配布された場合、これらのアプリケーションの機能が損なわれることになります。
直接結合しないように定義された別のインタフェースファミリには、malloc(3C) ファミリがあります。malloc() ファミリは、ユーザーアプリケーション内に頻繁に実装される別のインタフェースセットです。これらのユーザー実装はシステム定義に割り込むことを意図しています。
しかし、割り込み処理を作成するための先例とするため、割り込みライブラリは –z interpose を指定して作成されました。この明示的な割り込みには、libc.so.1 内に確立された直接結合の回避定義に対する不都合な相互作用はありません。
STV_SINGLETON 可視性が割り当てられているシンボルは、直接結合できません。Table 12–23 を参照してください。これらのシンボルは、コンパイルシステムによって、プロセス内の多数のオブジェクトで多重インスタンス化状態になる可能性がある実装に割り当てることができます。singleton シンボルへのすべての参照は、プロセス内で最初に定義された singleton に結合されます。