リンカーとライブラリ

共有オブジェクトの処理

共有オブジェクトは、分割不可能な、1 つまたは複数の入力ファイルの以前の編集によって生成された総体単位です。リンカーが共有オブジェクトを処理すると、共有オブジェクトの全内容は、その結果作成された出力ファイルイメージの「論理的」な部分になります。共有オブジェクトは、リンク編集中には物理的にコピーされないため、プロセスが実行されるまで実際には組み込まれません。この論理的な組み込みは、リンク編集プロセスにとって共有オブジェクト内に定義された「すべての」シンボルエントリが利用可能になることを意味しています。

リンカーは、共有オブジェクトの「プログラムデータ」セクションと、ほとんどの「リンク編集情報」セクションを使用しません。そのため、これらのセクションは、共有オブジェクトが結合された実行可能プロセスに生成されるときに、実行時リンカーによって変換されます。ただし、共有オブジェクトのエントリが記憶され、情報は出力ファイルイメージ内に格納されて、このオブジェクトには依存関係があり、実行時に使用可能にする必要があるかどうかが指示されます。

デフォルトでは、リンク編集の一部として指定された共有オブジェクトはすべて、作成されるオブジェクト内に依存関係として記録されます。この記録は、そのオブジェクトが、共有オブジェクトによって提供された実際のリファレンスシンボルを生成するかどうかに関係なく実行されます。実行時リンクのオーバヘッドを最小限にするには、作成されたオブジェクトからシンボルリファレンスを解析するために必要な依存関係だけを、リンク編集の一部として指定します。リンカーのデバッギング機能および -u オプションを指定した ldd(1) を使用して、使用されない依存関係を確認することができます。または、リンカーの -z ignore オプションを使用すると、使用しない共有オブジェクトの依存関係の記録を抑制できます。

共有オブジェクトに、他の共有オブジェクトに対する依存関係がある場合、この依存関係も処理されます。この処理は、すべてのコマンド行入力ファイルの処理が終了した後で実行されます。このような共有オブジェクトは、シンボル解析処理を完了させるために使用されますが、生成される出力ファイルイメージ内に、その名前は依存関係として記録されません。

リンク編集コマンド行上の共有オブジェクトの位置は、アーカイブ処理のための位置に比べるとそれほど重要ではありませんが、大域な効力を持たせることができます。複数のシンボルに同じ名前を付けると、再配置可能オブジェクトと共有オブジェクト間や複数の共有オブジェクト間に出現させることができます (詳細は、「シンボル解析」を参照)。

リンカーによって処理される共有オブジェクトの順序は、出力ファイルイメージ内に格納された従属情報に保持されます。実行時リンカーがこの情報を読み取るため、指定された共有オブジェクトは同じ順序で読み込まれます。そのため、リンカーと実行時リンカーは、多重に定義された一連のシンボルのうち、1 つのシンボルの最初のエントリを選択します。


注 -

複数のシンボル定義と、他のシンボル用に 1 つのシンボル定義の割り込みを説明した情報は、-m オプションを使用して生成されたロードマップ出力内に報告されます。