Oracle® Solaris 11.2 リンカーとライブラリガイド

印刷ビューの終了

更新: 2014 年 7 月
 
 

セクションからセグメントへの割り当て

入力セクションを出力セグメントに割り当てるプロセスには、次のデータ構造が関与します。

  • 入力セクション

    入力セクションは再配置可能オブジェクト入力からリンカーに読み取られます。一部の情報はリンカーによって検査および処理されますが、その他の情報は内容が検査されることなく単純に出力に渡されます (PROGBITS など)。

  • 出力セクション

    出力セクションは、出力オブジェクトに書き込まれるセクションです。一部のセクションは、入力オブジェクトから渡されたセクションの連結によって形成されます。シンボルテーブルや再配置セクションなどのその他のセクションは、一般的には入力オブジェクトから読み込んだ情報を組み込んで、リンカー自体によって生成されます。

    リンカーが入力セクションを通過させて出力セクションにした場合、そのセクションは通常、入力セクションの名前を保持します。ただし、リンカーは特定の状況で名前を変更できます。たとえば、リンカーは name%XXX という形式の入力セクション名を変換し、% 文字とその後に続く文字を出力セクションから削除します。

  • セグメント記述子

    リンカーは既知のセグメントのリストを保持しています。このリストは最初は、定義済みセグメントに記載されている定義済みセグメントが格納されています。LOAD_SEGMENTNOTE_SEGMENT、または NULL_SEGMENT の mapfile 指令が使用されて新しいセグメントが作成されると、新しいセグメント用の追加のセグメント記述子がこのリストに追加されます。新しいセグメントは、仮想アドレスの設定 (LOAD_SEGMENT) や、SEGMENT_ORDER 指令を使用して明示的に順序付けされないかぎり、このリストの末尾、同じタイプのほかのセグメントの後に配置されます。

    出力オブジェクトを作成するとき、リンカーはセクションを受け取るセグメントについてのみプログラムヘッダーを作成します。空のセグメントは自動的に無視されます。したがって、リンカーのリストからセグメント定義を削除するための明示的な機能はありませんが、ユーザー指定のセグメント定義を使用すると、定義済みセグメントの定義の使用を完全に置き換えることができます。

  • エントランス基準

    セクションを所定のセグメントに配置するために必要な一連のセクション属性を、そのセグメントのエントランス基準と呼びます。セグメントは任意の数のエントランス基準を持つことができます。

    リンカーは、定義済みのすべてのエントランス基準の内部リストを保持しています。このリストは、次に説明するように、セクションをセグメントに配置するために使用されます。各 mapfile は、LOAD_SEGMENTNOTE_SEGMENT、または NULL_SEGMENT の mapfile 指令の ASSIGN_SECTION 属性によって作成されたエントランス基準を、mapfile 内で見つかった順序でこのリストの上部に挿入します。定義済みセグメントで説明されている組み込みセグメントのエントランス基準は、このリストの最後に配置されます。したがって、mapfile で定義されるエントランス基準は組み込み規則よりも優先され、コマンド行の最後にある mapfile は、最初に検出されたものよりも優先されます。

出力オブジェクトに書き込まれる各セクションについて、リンカーは次の手順を実行して、セクションを出力セグメントに配置します。

  1. セクションの属性は、内部エントランス基準リストの先頭から各レコードと比較され、各エントランス基準が順番に検証されます。エントランス基準内のすべての属性が完全に一致したときにエントランス基準と一致したことになります。そのエントランス基準に関連付けられたセグメントは無効化されません。検索は、一致した最初のエントランス基準で停止し、セクションは関連付けられたセグメントに指定されます。

    エントランス基準に一致するものが見つからない場合、セクションはその他すべてのセグメントの後の、出力ファイルの最後に置かれます。この情報に関するプログラムヘッダーエントリは作成されません。デバッグセクションなどの割り当て不能なセクションは、ほとんどがこの領域に配置されることになります。

  2. セクションがセグメントの中に入る際に、リンカーは次のようにそのセグメントの既存の一連の出力セクションを検査します。

    セクションの属性値が既存の出力セクションの属性値と完全に一致する場合、セクションはその出力セクションに対応するセクションの列挙の最後に置かれます。

    一致する出力セクションが見つからない場合、配置されるセクションの属性を使用して新しい出力セクションが作成され、新しい出力セクション内に入力セクションが配置されます。この新しい出力セクションは、セグメント内で同じセクションタイプを持つほかの出力セクションの後ろに配置されますが、ほかの出力セクションが存在しない場合はセグメントの末尾に配置されます。


    注 - 入力セクションが、SHT_LOUSERSHT_HIUSER の間にユーザー定義のセクションタイプ値を保持する場合、このセクションは PROGBITS セクションとして処理されます。mapfile でこのセクションタイプ値に名前を付ける方法はありませんが、これらのセクションは、エントランス基準でその他の属性値指定 (セクションフラグ、セクション名) を使って付け直すことができます。