対応付け指示は、入力セクションをどのように出力セグメントに対応付けするかをリンカーに伝えます。基本的には、対応付け先のセグメントの名前を指定し、名前を指定したセグメントに対応付けするためにセクションの属性をどうすべきかを指定します。特定のセグメントに対応付けするためにセクションが持っていなければならないセクション属性値 (section_attribute_values) のセットは、そのセグメントの「エントランス基準」と呼ばれます。出力ファイル内の指定されたセグメントにセクションを置くには、セクションがセグメントのエントランス基準に正確に合致している必要があります。
対応付け指示には以下のような構文があります。
segment_name : {section_attribute_value}* [: {file_name}+];
セグメント名 (segment_name) に対して、任意の数のセクション属性値 (section_attribute_values) を任意の順序で指定し、それぞれは空白文字で区切ります (セクション属性ごとに 1 つの値だけ指定できます)。セクション属性ごとに 1 つの値だけを指定できます。file_name 宣言を使用して、特定の .o ファイルに由来するセクションだけに限定することも可能です。セクション属性とその有効値は表 8-2 に示すとおりです。
表 8-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) の形式で指定できる (例、 /usr/lib/libc.a(printf.o)) 。リンカーは、ファイル名の構文をチェックしない
file_name が *filename の形式になっている場合、リンカーはコマンド行で指定されたファイル名に対し basename(1) と同等の処理を行なって、指定された filename との一致を調べる。言い換えれば、mapfile で指定する filename は、コマンド行で指定されたファイル名の最後の部分だけが合致すればよい。詳細は 「対応付けの例」を参照
リンク編集の際に -l オプションを使っていて、-l オプションの後のライブラリが現在のディレクトリにある場合、mapfile 内のライブラリと一致させるために mapfile 内のライブラリの前に ./ (あるいはパス名全体) を付ける必要がある
特定の出力セグメントについて複数の指示行を指定できる。たとえば、次に示す一連の指示を行うことができる
S1 : $PROGBITS; S1 : $NOBITS;
1 つのセグメントに対して複数の対応付け命令行を指示することは、複数のセクション属性値を指定するための唯一の方法です。
1 つのセクションは複数のエントランス基準に合致することがある。その場合、mapfile で最初にエントランス基準が合致したセグメントが使われる。たとえば、mapfile が以下のようになっているとする
S1 : $PROGBITS; S2 : $PROGBITS;
この場合、$PROGBITS セクションは、セグメント S1 に対応付けられます。