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

印刷ビューの終了

更新: 2014 年 7 月
 
 

名前空間の確立

実行時リンカーは、動的実行可能なプログラムをその依存関係と結合すると、リンクマップのリンクリストを生成して、アプリケーションを記述します。リンクマップ構造は、アプリケーション内の各オブジェクトを記述します。リンクマップ構造は、/usr/include/sys/link.h に定義されています。アプリケーションのオブジェクトの結合に必要なシンボル検索メカニズムは、このリンクマップリスト全体を検索します。このリンクマップリストは、アプリケーションシンボル解決用の名前空間を提供します。

実行時リンカーも、リンクマップによって記述されます。このリンクマップは、アプリケーションオブジェクトのリストとは異なるリストで管理されます。この結果、実行時リンカーは固有の名前空間に存在するため、アプリケーションは実行時リンカー内のサービスを参照したり、直接アクセスしたりできません。したがって、アプリケーションは libc.so.1 または libdl.so.1 が提供するフィルタを介してのみ実行時リンカーにアクセスできます。

アプリケーションと実行時リンカーのリンクマップリストを定義するために、2 つの識別子が /usr/include/link.h に定義されています。

#define LM_ID_BASE      0     /* application link-map list */
#define LM_ID_LDSO      1     /* runtime linker link-map list */

実行時リンカーを使用すると、これら 2 つの標準リンクマップリストに加えて、任意の数の追加リンクマップリストを作成できます。これらの追加リンクマップリストでは、それぞれに固有の名前空間が提供されます。rtld 監査インタフェースは、監査ライブラリを保持するために独自のリンクマップリストを使用します。このため、監査ライブラリは、アプリケーションのシンボル結合要件から分離されます。すべての「rtld-監査」サポートライブラリには、固有の新しいリンクマップ識別子が割り当てられています。

監査ライブラリでは、dlmopen(3C) を使用するとアプリケーションのリンクマップリストを検査できます。RTLD_NOLOAD フラグを指定して dlmopen() を使用すると、監査ライブラリはオブジェクトを読み込まずにそのオブジェクトの有無を問い合わせることができます。