3.6.3 ベニアのタイプ

ベニアは、タイプごとに機能や使用するコードが異なります。

リンカでは、分岐要件に応じて、最も適した、小さくて高速なベニアを選択します。
  • インラインベニア:
    • 状態の切り替えのみを実行します。
    • ベニアは、範囲内に収まるようにターゲットセクションの直前に挿入する必要があります。
    • ARM から Thumb へのインターワーキングベニアの範囲は 256 バイトであるため、関数のエントリポイントはベニアの 256 バイトの範囲内に記述する必要があります。
    • Thumb から ARM へのインターワーキングベニアの範囲はゼロバイトであるため、関数のエントリポイントはベニアの直後に記述する必要があります。
    • インラインベニアは常に位置非依存です。
  • 短分岐ベニア:
    • Thumb から ARM へのインターワークを行う短分岐ベニアの範囲は 32 MB(ARM 命令の範囲)です。
    • 短分岐ベニアは常に位置非依存です。
  • 長分岐ベニア:
    • アドレス空間内のどこへでも分岐できます。
    • すべての長分岐ベニアはインターワーキングベニアにもなります。
    • 絶対コードと位置非依存コードの長分岐ベニアは異なります。
ベニアを使用する場合は、以下の点に注意して下さい。
  • インラインベニアの制限は、スキャッタファイルを使用してインラインベニアを実行領域の範囲外に移動できないことを意味します。コマンドラインオプション --no_inlineveneer を使用すると、インラインベニアが生成されなくなります。
  • すべてのベニアを 1 つの入力セクションにまとめることはできません。これは、結果として生じるベニア入力セクションが他の入力セクションの範囲内に収まらない可能性があるためです。セクションがアドレス範囲内に存在しない場合、長分岐は不可能です。
  • リンカにより、位置に依存しないベニアのバリアントが自動的に生成されます。ただし、このようなベニアは位置に依存するバリアントよりも大きいため、必要な場合(分岐元および分岐先の実行領域がどちらも位置に非依存で密接に関連している場合)にのみ、リンカがこの操作を行います。
ベニアは、コードサイズを最適化するために生成されます。そのため、armlink は以下の優先順序でバリアントを選択します。
  1. インラインベニア
  2. 短分岐ベニア
  3. 長分岐ベニア
関連する概念
3.6.1 ベニアとは
関連する参考文書
12.97 --max_veneer_passes=value
12.76 --inlineveneer、--no_inlineveneer
非機密扱いPDF file icon PDF 版ARM DUI0474LJ
Copyright © 2010-2015 ARM.All rights reserved.