SEGMENT_ORDER 指令は、出力オブジェクト内のセグメントのデフォルト以外の順序付けを指定するために使用されます。
SEGMENT_ORDER は、セグメント名の空白区切りのリストを受け入れます。
SEGMENT_ORDER = segment_name....; SEGMENT_ORDER += segment_name....;
「=」形式の代入を使用すると、以前のセグメント順序リストは破棄され、新しいリストで置き換わります。「+=」形式の代入の場合、既存のリストの末尾に新しいリストを連結します。
デフォルトでは、リンカーは次の順序でセグメントを順序付けします。
アドレスによって並べ替えられた、LOAD_SEGMENT 指令の VADDR 属性を使用してアドレスを明示した読み込み可能セグメント。
SEGMENT_ORDER 指令を使用して、指定された順序で並べ替えられたセグメント。
アドレスが明示されていない読み込み可能セグメントで、SEGMENT_ORDER リストに見つからないもの。
アドレスが明示されていない注釈セグメントで、SEGMENT_ORDER リストに見つからないもの。
アドレスが明示されていないヌルセグメントで、SEGMENT_ORDER リストに見つからないもの。
最初の読み込み可能セグメントは、読み取り専用、割り当て可能、および実行可能であることが期待され、ELF ヘッダーとプログラムヘッダー配列を受け取ります。これは通常、定義済みのテキストセグメントです。
実行可能ファイル内の最後の読み込み可能セグメントは、書き込み可能であることが期待され、動的ヒープの先頭は通常、同じ仮想メモリー割り当て内のすぐ後に配置されます。
mapfile を使用すると、これらの要件に違反するオブジェクトを作成できます。そのようなオブジェクトの実行結果は定義されていないため、この操作は回避する必要があります。
HDR_NOALLOC 指令が指定されないかぎり、リンカーは、最初のセグメントが注釈セグメントやヌルセグメントでなく、読み込み可能セグメントであるという要件を強制します。HDR_NOALLOC は 「ユーザーランド」のオブジェクト用に使用できないため、あまり実用的ではありません。この機能はオペレーティングシステムのカーネルを構築するときに使用されます。