適用範囲:DS-5
回答:
AArch32とAArch64のオブジェクトを一緒にリンクすることはできません。これら2つの実行状態は異なったABIを使用するのと、アドレス幅が異なる為です。ARMリンカ(armlink)でリンクを行った場合以下に類似するエラーが表示されます:
Error: L6831E: Mixing machine types EM_ARM and EM_AARCH64 is not permitted.
実行状態(AArch32/AArch64)は例外の発生またはリターン時のみ変更可能であるため、これは一般的なケースとして予期されない使い方です。その為、Aarch32コードは直接AArch64コードを呼び出すこと(あるいはその逆)はできません。
しかしながら一部のケースで混在したイメージをビルドすることが有効である場合があります。このような場合、いくつかのオプションがあります:
DCI
ARMアセンブラ(armasm)にはDCIディレクティブがあります。このディレクティブは命令を16進の値で定義することを可能にします。DCIではターゲットプロセッサまたは命令セットに対して整合性をチェックされません。DCIの使用によりA32/T32イメージにA64オペコードを含める、あるいはA64イメージにA32/T32オペコードを含めることが可能になります。
このアプローチは異なる命令セット内に短いシーケンスを含めたいだけの場合には便利な方法です。例えば、EL1をAArch32で設定してから例外レベルへ移行する基本的なA64ブートストラップなどがあります。
DCIディレクティブの詳細については、こちらをご参照ください。
INCBIN
INCBINディレクティブではオブジェクト内にバイナリデータとしてファイルをインクルードすることができます。このディレクティブは1つのイメージを他のイメージ内に挿入するために使用できます。例えば、AArch65ブートローダプログラムにAArch32 OSイメージをバイナリとしてインクルードさせることが可能です。
INCBINの詳細については、こちらをご参照ください。
Symdefs File
一部のケースでは2つのイメージ間でアドレス情報の共有だけが必要な場合があります。例えば、共有データのアドレスが該当します。ARMリンカ(armlink)はイメージに定義されているグローバルシンボルとそのアドレスのリストをシンボル定義ファイル(symdefs file)に出力できます。このファイルはそれらのシンボルへの参照を解決するためのファイルとしてリンカに渡すことで、他のリンクステップにおける入力として使うことができます。
注意:
共有したいシンボルだけをインクルードするために、生成されたsymdef fileの内容を整形しなければならないことがあります。
symdefs fileの生成と使用の詳細についてはこちらを参照してください。
INCBINのサンプルが以下のARM FAQサイトにあります:
"Can AArch32 and AArch64 objects be linked together?"