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