対応付け指令は、入力セクションをどのように出力セグメントに対応付けするかをリンカーに伝えます。基本的には、対応付け先のセグメントの名前を指定し、名前を指定したセグメントに対応付けするためにセクションの属性をどうすべきかを指定します。特定のセグメントに対応付けするためにセクションが持っていなければならないセクション属性値 (section_attribute_values) のセットは、そのセグメントの「エントランス基準」と呼ばれます。出力ファイル内の指定されたセグメントにセクションを置くには、セクションがセグメントのエントランス基準に正確に合致している必要があります。
対応付け指令には次のような構文があります。
segment_name : {section_attribute_value}* [: {file_name}+];
セグメント名 (segment_name) に対して、任意の数のセクション属性値 (section_attribute_values) を任意の順序で指定し、それぞれは空白文字で区切ります。セクション属性ごとに 1 つの値だけを指定できます。file_name 宣言を使用して、特定の .o ファイルに由来するセクションだけに限定することも可能です。セクション属性とその有効値は次の表に示すとおりです。
表 9–2 セクション属性
セクション属性 |
値 |
---|---|
section_name |
任意の有効なセクション名 |
section_type |
$PROGBITS $SYMTAB $STRTAB $REL $RELA $NOTE $NOBITS |
section_flags |
? [[!]A] [[!]W] [[!]X] |
対応付け指令を入力する場合、次の点に注意してください。
前記の section_types から 1 つの値を選択します。前記の section_types は組み込まれています。section_types の詳細については、「セクション」を参照してください。
section_flags 値は、A は割り当て可能 、W は書き込み可能、X は実行可能です。個々のフラグの前に感嘆符 (!) がついている場合、リンカーは、フラグが設定されていないことを確認します。section_flags 値を構成する疑問符、感嘆符、および個々のフラグの間には空白文字を入れてはいけません。
file_name には、ファイル名として正当な名前を *filename または archive_name(component_name) の形式で指定できます (例、/lib/libc.a(printf.o)) 。リンカーは、ファイル名の構文をチェックしません。
file_name が *filename の形式になっている場合、リンカーはコマンド行からファイルの basename(1) を判断します。このベース名を使って、指定された file name との一致が実行されます。言い換えれば、mapfile で指定する filename は、コマンド行で指定されたファイル名の最後の部分だけが合致する必要があります。「対応付けの例」を参照してください。
リンク編集で -l オプションを使用するときに、-l オプションのあとのライブラリがカレントディレクトリ内にある場合は、そのライブラリを検出させるため、名前の前に ./ を付けるか、またはパス名全体を mapfile 内で記述する必要があります。
特定の出力セグメントについて複数の指令行を指定できます。たとえば、次に示す一連の指令を行うことができます。
S1 : $PROGBITS; S1 : $NOBITS;
1 つのセグメントに対して複数の対応付け指令行を指示することは、複数のセクション属性値を指定するための唯一の方法です。
1 つのセクションは複数のエントランス基準に合致することがあります。その場合、mapfile で最初にエントランス基準が合致したセグメントが使われます。たとえば、mapfile が次のようになっているとします。
S1 : $PROGBITS; S2 : $PROGBITS;
この場合、$PROGBITS セクションは、セグメント S1 に対応付けられます。