8.17 スキャッタファイルの処理時の複数のマッチングをリンカが解決する方法

入力セクションは固有(ユニーク)である必要があります。複数の一致がある場合、入力セクションの記述の属性に基づいて、リンカは領域に入力セクションを割り当てようとします。

入力セクションは固有(ユニーク)である必要があります。複数の一致がある場合、リンカは最も明示的な module_select_pattern input_section_selector の組み合わせに基づいて、領域に入力セクションを割り当てようとします。ただし、固有(ユニーク)の一致が検出されない場合は、そのスキャッタロードの記述の処理が中止されます。

次の変数は、リンカではどのように複数の入力セクションとの一致が行われるかを記述します。

  • m1m2 は、モジュールセレクタパターンを表します。

  • s1s2 は入力セクションセレクタを表します。

たとえば、入力セクション A が実行領域 R1 の m1,s1 と一致し、さらに実行領域 R2 の m2,s2 とも一致する場合は、以下のように処理されます。

  • m1,s1m2,s2 よりも明示的である場合、A は R1 に割り当てられます。

  • m2,s2m1,s1 よりも明示的である場合、A は R2 に割り当てられます。

  • m1,s1m2,s2 よりも明示的ではなく、m2,s2m1,s1 よりも明示的ではない場合は、そのスキャッタロードの記述にエラーがあると診断されます。

armlink は以下のシーケンスを使用して、 module_select_pattern input_section_selector の最も明示的な組み合わせを決定します。

  1. モジュールセレクタパターンの場合:

    テキスト文字列 m1 がパターン m2 と一致し、テキスト文字列 m2 がパターン m1 と一致しない場合、m1m2 よりも明示的です。

  2. 入力セクションセレクタの場合:

    • s1s2 が両方ともセクション名と一致するパターンである場合には、モジュールセレクタパターンと同じ定義が使用されます。

    • s1s2 のいずれかが入力セクション名と一致し、他方が入力セクション属性と一致する場合、s1s2 は順序がなく、その記述にエラーがあると診断されます。

    • s1s2 の両方が入力セクション属性に一致する場合、 s1s2 よりも明示的かどうかは、以下の関係によって決定されます。

      • ENTRYRO-CODERO-DATARW-CODE または RW-DATA のどれよりも明示的である。

      • RO-CODERO よりも明示的である。

      • RO-DATARO よりも明示的である。

      • RW-CODERW よりも明示的である。

      • RW-DATARW よりも明示的である。

      • セクション属性間には上記以外の(s1s2 よりも明示的である)関係がない。

  3. module_select_pattern、input_section_selector の組み合わせの場合、 以下のいずれかが当てはまる場合にのみ、m1,s1m2,s2 より明示的です。

    1. s1 がリテラルの入力セクション名(つまり、パターン文字が含まれていない名前)であり、 s2+ENTRY 以外の入力セクション属性と一致する。

    2. m1m2 よりも明示的である。

    3. s1s2 よりも明示的である。

    条件 3.a が条件 3.b3.c に優先され、条件 3.b が条件 3.c より優先されるように、条件がテストされます。

このマッチング方式による影響は以下のとおりです。

  • 記述は、ファイル内に書かれた順序に依存しません。

  • 通常、オブジェクトの記述がより明示的であるほど、そのオブジェクトに含まれている入力セクションの記述がより明示的になります。

  • input_section_selector は以下の場合を除いて検出されません。

    • オブジェクトの選択が確定されない場合。

    • 一方のセレクタが入力セクションの名前を具体的に指定し、もう一方のセレクタが属性によって選択する場合。この場合、明示的な入力セクションの名前は、ENTRY を除くどの属性よりも明示的であり、1 つのオブジェクトから 1 つの入力セクションのみが選択されます。このことは、入力セクションの名前に関連するオブジェクトのセレクタが、属性のセレクタより明示的ではない場合にも当てはまります。

.ANY モジュールセレクタは、スキャッタロード記述からは解決できないセクションを割り当てるために利用できます。

複数の実行領域とパターンのマッチング

次の例は、複数の実行領域とパターンのマッチングを示しています。

LR_1 0x040000             {                                 ER_ROM 0x040000              ; 起動時の実行領域アドレスは     {                            ; ロードアドレスと同じ。           application.o (+ENTRY)   ; オブジェクトからのエントリポイントを含む     }                            ; セクションはここに配置ER_RAM1 0x048000           {         application.o (+RO-CODE) ; オブジェクトからの他の RO コードはここに移動する     }     ER_RAM2 0x050000          {         application.o (+RO-DATA) ; RO データはここに移動する     }     ER_RAM3 0x060000      {         application.o (+RW)      ; RW コードとデータはここに移動する     }     ER_RAM4 +0                   ; ER_R3 に続けて記述する     {         *.o (+RO, +RW, +ZI)      ; application.o 以外のすべてをここに移動する     } }
関連する概念
7.13 .ANY モジュールセレクタによる未割り当てセクションの配置
8.15 入力セクションの記述
関連する参考文書
8.2 スキャッタファイルの構文
8.16 入力セクション記述の構文
非機密扱いPDF file icon PDF 版ARM DUI0474JJ
Copyright © 2010-2013 ARM.All rights reserved.