.ANY モジュールセレクタによる未割り当てセクションの配置

リンカは、特定の実行領域に対して入力セクションの配置を試みます。 解決できない入力セクションが存在し、そうしたセクションの配置が重要でない場合は、スキャッタファイルで .ANY モジュールセレクタを使用できます。

ほとんどの場合、1 つの .ANY セレクタを使用しても、* モジュールセレクタを使用しても、同じ結果が得られます。 ただし、* とは異なり、.ANY は複数の実行領域に指定できます。

Show/hide未割り当てセクションのデフォルトの配置規則

リンカが未割り当てセクションを割り当てる際のデフォルトの規則を次に示します。

  • 現在最も空きスペースのある実行領域に未割り当てセクションを配置します。 未割り当てセクションに使用する最大スペースサイズを実行領域属性 ANY_SIZE で指定できます。

  • セクションをサイズの降順にソートします。

Show/hide複数の .ANY セレクタを使用した場合の配置規則

スキャッタファイルに複数の .ANY セレクタが存在している場合、リンカは、未割り当てセクションのうち、サイズが最大のセクションを取得し、それを最も限定的で空きスペースが十分ある .ANY 実行領域に割り当てます。 例えば、.ANY(.text) は、.ANY(+RO) よりも限定的だと判断されます。

複数の実行領域が等しく限定的である場合、空きスペースが最も大きい実行領域にセクションが割り当てられます。

以下に例を示します。

  • 2 つの実行領域が同じくらい限定的であり、1 つはサイズ制限が 0x2000 で、もう 1 つは制限がない場合、後者の無制限の .ANY 領域にすべてのセクションが割り当てられます。

  • 2 つの実行領域が同じくらい限定的であり、1 つはサイズ制限が 0x2000 で、もう 1 つはサイズ制限が 0x3000 である場合、配置されるセクションはまず、サイズ制限が 0x3000 である後者の .ANY 領域に、.ANY の残りサイズが 0x2000 になるまで割り当てられていきます。 その後は、両方の .ANY 実行領域に交互にセクションが割り当てられます。

Show/hide.ANY セクションの優先順位

複数の .ANY セクションがある場合は、.ANYnum セレクタ(num は、ゼロまたはそれより大きい正の整数)で優先順位を指定できます。 最も大きい整数を持ったセレクタに、最も高い優先順位が設定されます

以下に、.ANYnum の使用例を示します。

lr1 0x8000 1024
{
    er1 +0 512
    {
        .ANY1(+RO) ; er3 と均等に分散
    }
    er2 +0 256
    {
        .ANY2(+RO) ; 最も優先順位が高いため、最初に処理される
    }
    er3 +0 256
    {
        .ANY1(+RO) ; er1 と均等に分散
    }
}

Show/hide複数の .ANY セレクタがある場合の入力セクション配置の制御

複数の .ANY セレクタを使用している場合、リンカによる未割り当て入力セクションの配置動作は、配置アルゴリズムまたはソート順序を変えることによって制御できます。 以下のコマンドラインオプションが利用できます。

  • --any_placement=algorithmalgorithm には、first_fitworst_fitbest_fitnext_fit のいずれかを指定します。

  • --any_sort_order=orderorder には、cmdline または descending_size を指定します。

領域を順に埋めていくには、first_fit を使用します。

領域をその上限まで埋めるには、best_fit を使用します。

領域を均等に埋めるには、worst_fit を使用します。 同じサイズの領域およびセクションの場合、worst_fit は、領域を循環的に埋めていきます。

より確定的なパターンで埋めていく必要がある場合は、next_fit を使用します。

first_fitbest_fit で、領域の上限まで埋めていくと、領域が一杯になってしまう可能性があります。 これは、リンカによって生成されるコンテンツ(パディングベニアなど)は、セクションが .ANY セレクタに割り当てられるまで判明しないためです。 その場合は、次のエラーが表示されます。

エラー: L6220E: 実行領域 regionname のサイズ (size バイト) が制限 (limit バイト) を超えています。

--any_contingency は、領域が埋め尽くされるのを防ぐためのオプションです。 リンカによって生成されるコンテンツのために、領域の全体のうち一部のサイズが保されます。この非常用(contingency)のエリアは、他に空きのある領域がない場合にしか使用されません。 この動作が最も起きやすい first_fit および best_fit のアルゴリズムでは、このオプションがデフォルトで有効になっています。

Show/hide未割り当てセクションの配置に使用できる最大サイズの指定

実行領域属性 ANY_SIZE max_size を使用すると、armlink が未割り当てセクションで満たすことができる領域の最大サイズを指定できます。

このキーワードを使用する場合は、以下の制限事項に注意して下さい。

  • max_size は、領域サイズ以下である必要があります。

  • .ANY セレクタなしで ANY_SIZE を領域上で使用できますが、これは armlink によって無視されます。

ANY_SIZE が存在する場合、armlink は以下のようになります。

  • 所定の .ANY サイズをオーバーライドしません。 つまり、優先順位を下げずに、後でより多くのセクションをフィットさせようとします。

  • コンティンジェンシーを再計算しません。

  • コンティンジェンシースペースにセクションを割り当てません。

ANY_SIZE では、--any_contingency の指定は必要ありません。 ただし、--any_contingency が指定されても ANY_SIZE は指定されない場合、armlink はコンティンジェンシーを調整しようとします。 目的は以下のとおりです。

  • .ANY 領域をオーバーフローしない

  • セクションをコンティンジェンシー予約済みスペースに配置することを拒否しない

コマンドラインで --any_contingency を指定しても、ANY_SIZE を指定した領域では無視されます。 ANY_SIZE が指定されていない領域では、通常どおり使用されます。

以下に、ANY_SIZE の使用例を示します。

LOAD_REGION 0x0 0x3000
{
   ER_1 0x0 ANY_SIZE 0xF00 0x1000
   {
      .ANY
   }
   ER_2 0x0 ANY_SIZE 0xFB0 0x1000
   {
      .ANY
   }
   ER_3 0x0 ANY_SIZE 0x1000 0x1000
   {
      .ANY
   }
}

この例では、以下のようになります。

  • ER_1 には、リンカ生成コンテンツのために予約された 0x100 があります。

  • ER_2 には、リンカ生成コンテンツのために予約された 0x50 があります。 これは、--any_contingency の自動コンティンジェンシーとほとんど同じです。

  • ER_3 には、予約済みスペースはありません。 したがって、領域は 100% 満たされ、ベニア用のコンティンジェンシーは残りません。 ANY_SIZE パラメーターを省略すると、領域の 98% が満たされ、2% はベニア用コンティンジェンシーとなります。

Show/hide関連項目

Copyright © 2010-2012 ARM. All rights reserved.ARM DUI 0474GJ
Non-ConfidentialID051612