リンカーとライブラリ

名前空間の確立

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

実行時リンカーも、リンクマップによって記述されます。このリンクマップは、アプリケーションオブジェクトのリストとは異なるリストで管理されます。この結果、実行時リンカーが固有の名前空間内に常駐することになるため、アプリケーションが実行時リンカー内のサービスに結合されることはなくなります。アプリケーションは、フィルタ libc.so.1 または libdl.so.1 を介して、実行時リンカーの公開サービスを呼び出すことができるだけです。

「rtld-監査」インタフェースは、監査ライブラリが保持される各自のリンクマップリストを使用します。このため、監査ライブラリは、アプリケーションのシンボル結合要件から分離されます。アプリケーションリンクマップリストの検査は、dlmopen(3C) によって実行できます。dlmopen(3C)RTLD_NOLOAD フラグとともに使用すると、監査ライブラリで、オブジェクトを読み込むことなくその存在を照会することができます。

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

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

すべての「rtld-監査」サポートライブラリには、固有の新しいリンクマップ識別子が割り当てられています。