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

印刷ビューの終了

更新: 2014 年 7 月
 
 

NODIRECT mapfile キーワードの使用方法

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() ファミリは、ユーザーアプリケーション内に頻繁に実装される別のインタフェースセットです。これらのユーザー実装はシステム定義に割り込むことを意図しています。


注 - Oracle Solaris OS には、代替の malloc() 実装を提供する、さまざまなシステム割り込みライブラリが備わっています。また各実装は、プロセス内で使用される唯一の実装であることが期待されます。すべての malloc() 割り込みライブラリは –z interpose オプションを指定して作成されています。libc.so.1 内の malloc() ファミリは、直接結合しないようにラベル付けされているので、このオプションは必ずしも必要ではありません。

しかし、割り込み処理を作成するための先例とするため、割り込みライブラリは –z interpose を指定して作成されました。この明示的な割り込みには、libc.so.1 内に確立された直接結合の回避定義に対する不都合な相互作用はありません。


STV_SINGLETON 可視性が割り当てられているシンボルは、直接結合できません。Table 12–23 を参照してください。これらのシンボルは、コンパイルシステムによって、プロセス内の多数のオブジェクトで多重インスタンス化状態になる可能性がある実装に割り当てることができます。singleton シンボルへのすべての参照は、プロセス内で最初に定義された singleton に結合されます。