リンカーとライブラリ

名前空間の確立

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

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

rtld-監査インタフェースは、すべての監査ライブラリを保持するための各自のリンクマップリストを使用します。このため、監査ライブラリは、アプリケーションのシンボル結合条件から分離されます。アプリケーションリンクマップリストの検査は、dlmopen(3DL) によって実行できます。dlmopen(3DL)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-監査サポートライブラリには、固有の空きリンクマップ識別子が割り当てられています。