リンカーとライブラリ

出力イメージの生成

入力ファイルの処理とシンボル解析がすべて、重大なエラーが発生することもなく完了すると、リンカーは出力イメージファイルの生成を開始します。リンカーは、出力ファイルイメージを完成させるために生成する必要がある追加セクションを確立します。これには、入力ファイルからの局所シンボル定義が組み込まれたシンボルテーブルとともに、その内部シンボルテーブルから収集された大域およびウィークシンボル情報が組み込まれます。

また、実行時リンカーが必要とする、出力の再配置および動的情報セクションも組み込まれます。出力セクション情報が確立されると、出力ファイルの合計サイズが算出され、それに従って出力ファイルイメージが作成されます。

動的実行可能プログラムまたは共有オブジェクトを構築するときに、通常、2 つのシンボルテーブルが生成されます。.dynsym とその関連ストリングテーブル .dynstr には、レジスタ (これらがローカルであっても)、大域シンボル、ウィークシンボル、およびセクションシンボルが組み込まれます。これらのセクションは、実行時にプロセスイメージの一部として対応付けされる text セグメントの一部になります。これにより、実行時リンカーは、これらのセクションを読み取り、必要な再配置を実行できます。

.symtab とその関連ストリングテーブル .strtab には、入力ファイル処理から収集された「すべての」シンボルが含まれています。これらのセクションは、プロセスイメージの一部として対応付けされず、リンカーの -s オプションを使用するか、リンク編集後に strip(1) を使用して、イメージから取り除くことさえ可能です。

予約シンボルは、シンボルテーブルの生成中に作成されます。予約シンボルは、リンクプロセスに対する特別な意味を持ち、ユーザーのコードでは定義できません。

_etext

テキストセグメントのあとの最初のロケーション

_edata

初期化されたデータの最初のロケーション

_end

すべてのデータのあとの最初のロケーション

_DYNAMIC

動的情報セクション (.dynamic セクション) のアドレス

_END_

_end と同じですが、このシンボルには局所範囲があります (「_START_」を参照)。

_GLOBAL_OFFSET_TABLE_

リンカーが提供するアドレステーブル (.got セクション) への、ポジション固有のリファレンス。このテーブルは、ポジション固有のデータリファレンスから構成されます。このデータリファレンスは、 -K pic オプションを使用してコンパイルされたオブジェクト内で発生します (詳細については、「位置に依存しないコード」を参照してください)。

_PROCEDURE_LINKAGE_TABLE_

リンカーが提供するアドレステーブル (.plt セクション) への、ポジション固有のリファレンス。このテーブルは、ポジション固有の関数リファレンスから構成されます。このデータリファレンスは、-K pic オプションを使用してコンパイルされたオブジェクト内で発生します (詳細については、「位置に依存しないコード」を参照してください)。

_START_

テキストセグメント内の最初のロケーション。このシンボルは、_END_ とともに、局所範囲を持ち、オブジェクトのアドレス範囲を確立する手段を提供します。

リンカーは、実行可能プログラムを生成する場合、追加シンボルを検出して実行可能プログラムのエントリポイントを定義します。シンボルがリンカーの -e オプションを使用して指定された場合、これが使用されます。それ以外の場合は、リンカーは予約シンボル名 _startmain を検出します。これらのシンボルが存在しない場合には、テキストセグメントの最初のアドレスが使用されます。

出力ファイルを作成すると、入力ファイルからのすべてのデータセクションは新しいイメージにコピーされます。入力ファイル内に指定された再配置は、出力イメージに適用されます。生成する必要がある新しい再配置情報に加えて、他のリンカーが生成した情報もすべて、新しいイメージに書き込まれます。