リンカーとライブラリ

mapfile オプションの初期値

リンカーは、「セグメントの宣言」で説明したように、初期値の segment_attribute_values で 3 つの組み込みセグメント (textdata、および note)、および対応する初期値の対応付け命令を定義します。リンカーは初期値を提供するのに実際の mapfile は使いませんが、ここでは初期値の内容を mapfile に書かれているものとして、リンカーがユーザーの mapfile を処理する際にどのようなことが起こるかを説明します。

以下に示す例は、リンカーの初期値を mapfile として表現したものです。リンカーは、mapfile をすでに読み取ったかのように実行を開始します。その後でリンカーは、mapfile を読み取ったり、あるいは初期値への追加や変更を行なったりします。


text = LOAD ?RX; 
text : ?A!W; 
data = LOAD ?RWX; 
data : ?AW; 
note = NOTE; 
note : $NOTE;

mapfile の各セグメント宣言は読み取られる際、以下のようにセグメント宣言の既存リストと比較されます。

  1. セグメントが mapfile に存在しておらず、同じ segment-type 値の別のセグメントが存在する場合、そのセグメントは、すべての同じ segment_type の既存セグメントの前に追加される

  2. セグメントが読み取られたとき、既存の mapfile に同じ segment_type のセグメントがない場合、セグメントは、segment_type 値が以下の順序になるように追加される

    INTERP

    LOAD

    DYNAMIC

    NOTE

  3. セグメントの segment_typeLOAD で、この LOAD 可能なセグメントに virtual_address 値を定義していた場合、セグメントは、virtual_address 値が定義されていない、あるいはより高い virtual_address 値の LOAD が指定されたセグメントの前、そしてそれよりも低い virtual_address 値のセグメントの後に置かれる

mapfile の各対応付け指示が読み取られる際、同じセグメントに対してすでに指定されたその他の対応付け指示の後 (かつ、そのセグメントのデフォルトの対応付け指示の前) に、指示が追加されます。