リンカーとライブラリ

直接結合

直接結合を行うオブジェクトを作成すると、参照されるシンボルと、定義を提供する依存との関係は、作成されるオブジェクトに記録されます。実行時リンカーは、デフォルトのシンボル検索モデルを使用する代わりに、この情報を使って関連するオブジェクトから直接シンボルを検索します。直接結合情報は、リンク編集で指定される依存関係に対してのみ確立されます。したがって、-z defs オプションを推奨します。

直接結合は、以下のメカニズムのどれかを使用して確立できます。

直接結合モデルでは、多数のシンボル再配置や依存関係を伴う動的プロセスでのシンボル検索オーバーヘッドを大幅に削減できます。さらに、このモデルでは、同じ名前の複数のシンボルを、それらが直接結合されている個々のオブジェクトから見つけることができます。

直接結合ではデフォルトの検索モデルがバイパスされるため、従来から使用されている割り込みシンボルが迂回される可能性があります。デフォルトのモデルでは必ず、1 つのシンボルへのすべての参照は同じ 1 つの定義に結合されます。

直接結合環境でも、オブジェクト単位で、割り込みを行うことができます。それには、オブジェクトが割り込み処理として識別される必要があります。環境変数 LD_PRELOAD を使ってオブジェクトを読み込むか、リンカーの -z interpose オプションを使ってオブジェクトを作成すると、オブジェクトは割り込み処理として識別されます。 実行時リンカーは、直接結合されたシンボルを検索する際に、割り込み処理として識別されたオブジェクトを最初に探してから、シンボル定義を指定するオブジェクトを探します。


注 –

直接結合を実行時に無効にするには、環境変数 LD_NODIRECT にヌル以外の値を設定します。


デフォルト手法の代替実装を提供するインタフェースがいくつか存在します。これらの実装は、自身が、プロセス内におけるその手法の唯一のインスタンスであることを前提とします。この例の 1 つにmalloc(3C) ファミリがあります。同じプロセスによってその手法のインスタンスが複数参照される可能性があるため、このようなファミリ内でのインタフェースへの直接結合は避ける必要があります。たとえば、プロセス内の 1 つの依存関係が libc.so.1 に直接結合し、一方で別の依存関係が libmapmalloc.so.1 に直接結合する可能性があります。

プロセスに単一の実装を提供するオブジェクトは、mapfile 指令の NODIRECT を使用してその実装にインタフェースを定義する必要があります。この指令によって、どのユーザーも実装に直接結合することなく、デフォルトのシンボル検索モデルを使用するよう、保証されます。


注 –

NODIRECT mapfile 指令は、コマンド行オプション -B direct-z direct と組み合わせることができます。シンボルに NODIRECT を明示的に定義しないと、そのシンボルはコマンド行の指令に従います。