Skip to main content

IAR Embedded Workbench for Arm 9.70.x

AEABIへの準拠

このセクションの内容:

ArmArm用IARビルドツールは、Arm Limitedが提唱するEmbedded Application Binary Interface for Arm (AEABI)をサポートしています。このインタフェースは、Intel IA64 ABIインタフェースに基づいています。AEABIに準拠すると、他のベンダにより提供されるツールで生成されていても、モジュールを他の任意のAEABI準拠モジュールとリンクできるというメリットがあります。

Arm用IARビルドツールは、AEABIの以下のパートをサポートしています。

AAPCS

32ビットのArmアーキテクチャのプロシージャ呼び出し標準

CPPABI

32ビットのArmアーキテクチャのC++ ABI

AAELF

32ビットのArmアーキテクチャのELF

AADWARF

32ビットのArmアーキテクチャのDWARF

RTABI

32ビットのArmアーキテクチャのランタイムABI

CLIBABI

32ビットのArmアーキテクチャのCライブラリABI

AAPCS64

64ビットのArmアーキテクチャのプロシージャ呼び出し標準

VFABIA64

64ビットのArmアーキテクチャのベクタ関数アプリケーションバイナリインターフェース仕様

ELF64

64ビットのArmアーキテクチャのELF

DWARF64

64ビットのArmアーキテクチャのDWARF

CPPABI64

64ビットのArmアーキテクチャのC++ ABI

IARビルドツールは、明示的なオペレーティングシステムがないROMベースシステムのみをサポートします。

注:

  • AEABIはC89専用です。

  • AEABIは、C++ライブラリとの互換性を指定しません。

  • enumおよびwchar_tのいずれのサイズも、AEABIでは一定ではありません。

  • 64ビットArmにはランタイムABIまたはC ABIはありません。64 ビットモードのコンパイラオプション--aeabiには影響はありません。

AEABI準拠が有効な場合は、特定のプリプロセッサ定数は実際の定数変数になります。

IAR ILINKリンカを使用してAEABI準拠モジュールをリンクする

IAR ILINKリンカを使用してアプリケーションを構築する場合、以下のタイプのモジュールを組み合わせることができます。

  • IARビルドツールを使用して生成されたモジュール(AEABI準拠モジュールとAEABI準拠でないモジュールの両方)

  • 別のベンダのビルドツールを使用して生成されたAEABI準拠モジュール

注記

別のベンダのコンパイラで生成されたモジュールをリンクするには、そのベンダの追加サポートライブラリが必要になることがあります。

IAR ILINKリンカは、オブジェクトファイルに含まれる属性に基づき、使用する適切な標準C/C++ライブラリが自動的に選択されます。インポートされるオブジェクトファイルには、これらのすべての属性が含まれないことがあります。そのため、このような場合、以下の1つ以上の項目を検証して、ILINKによる標準ライブラリの選択をサポートする必要があります。

  • 少なくても1つのIAR C/C++コンパイラfor Armでのモジュールビルドを含めます。

  • ‑‑cpu リンカオプションで指定する使用するCPU。

  • 完全なI/O が必要な場合、「フル」のライブラリ設定の標準ライブラリとのリンクの保証。

潜在的な非互換性は以下を含みますが、これらがすべてではありません。

  • enumのサイズ

  • wchar_tのサイズ

  • 呼び出し規約

  • 使用された定数セット

AEABI-準拠のモジュールをリンクする際には、ILINK を使用したリンクアプリケーションのリンクの章の情報も考慮してください。

サードパーティ製リンカを使用してAEABI準拠のモジュールをリンクする

IAR C/C++コンパイラを使用してモジュールを生成し、このモジュールを別のベンダのリンカを使用してリンクする場合、このモジュールはAEABI準拠モジュールでなければなりません(AEABI準拠をコンパイラで有効にするを参照)。

また、このモジュールが任意のIAR固有コンパイラ拡張を使用する場合、これらの機能が他のベンダのツールによりサポートされている必要があります。特に以下のことに注意してください。

  • 下の拡張のサポートを検証する必要があります:#pragma pack__no_init__rootおよび__ramfunc

  • 以下の拡張は使用しても問題ありません。#pragma location/@__arm__thumb__svc__irq__fiq、および__nested

AEABI準拠をコンパイラで有効にする

AEABI準拠をコンパイラで有効にするには、‑‑aeabiオプションを設定します。この場合、--guard_callsオプションも使用する必要があります。

注意

IDEで、[プロジェクト]>[オプション]>[C/C++コンパイラ]>[追加オプション]ページを使用して、‑‑aeabiオプションおよび‑‑guard_callsオプションを指定します。

危険

コマンドラインで、オプション‑‑aeabi‑‑guard_callsを使用して、コンパイラでのAEABIサポートを有効にします。

また、特定のシステムヘッダファイルでAEABIのサポートを有効にするには、システムヘッダを含める前にプロセッサシンボル_AEABI_PORTABILITY_LEVELを非ゼロに定義し、シンボルAEABI_PORTABLEがヘッダファイルの追加後に非ゼロに設定されるようにする必要があります。

#define _AEABI_PORTABILITY_LEVEL 1
#undef _AEABI_PORTABLE
#include <header.h>
#ifndef _AEABI_PORTABLE
 #error "header.h not AEABI compatible"
#endif