アプリケーションバイナリインタフェース

アプリケーションバイナリインタフェース(ABI)とは



アプリケーションバイナリインタフェース(ABI: Application Binary Interface)は、アプリケーションプログラムとシステム(オペレーティングシステムライブラリ)との間で、バイナリレベルでのインターフェースを定めたものです。これは、プログラムが実行される際に、ハードウェアオペレーティングシステムの詳細な実装を意識せずに、正しく動作するための取り決めと言えます。また、アプリケーション間の連携や、プラグインなどの部品とのインターフェースもABIによって規定されます。

APIとの違い



ABIは、アプリケーションプログラミングインタフェース(API: Application Programming Interface)とは異なります。APIは、ソースコードライブラリ間のインターフェースを定義するものであり、同じAPIをサポートするシステムでは、同じソースコードをコンパイルすることで利用できます。一方、ABIは、オブジェクトコードレベルのインターフェースであり、互換性のあるABIをサポートするシステム間では、コンパイル済みの実行ファイルを修正せずにそのまま動作させることができます。

ABIの構成要素



ABIには、以下のような定義が含まれます。

CPU: 命令セット、エンディアン(バイト順序)など、CPUアーキテクチャに関する定義。
データ: データ型、サイズ、配置(アラインメント)など、データの構造に関する定義。
呼出規約: 関数の引数の渡し方や、戻り値の渡し方など、関数呼び出しに関する定義。
システムコール: システムコール番号と具体的なシステムコールの仕組みに関する定義。
実行ファイル[[フォーマット]]: 実行ファイルライブラリの詳細なフォーマット(例:UNIX系のCOFFやELFなど)に関する定義。

Intel Binary Compatibility Standard (iBCS)



iBCSのような完全なABIでは、OSの種類に関わらず、必要な共有ライブラリが存在するなど、前提条件が満たされていれば、そのABIをサポートしたシステム間で、プログラムを修正なしに動作させることが可能です。これは、異なるOS上で同じアプリケーションを実行できることを意味します。

プラットフォーム間のABI



C++の名前修飾、例外の伝播、呼び出し規約などもABIに含まれますが、これらは通常、同じプラットフォーム上のコンパイラ間のABIであり、プラットフォームを跨いでの互換性までは保証されません。

EABI(Embedded Application Binary Interface)



組み込みシステム向けのABIであるEABIは、ファイル[[フォーマット]]、データ型、レジスタの使用法、スタックフレームの構造、関数の引数渡し方法など、組み込みソフトウェアに関する詳細な規約を定めています。EABIをサポートするコンパイラで生成されたオブジェクトコードは、コンパイラが異なっていても、同じEABIに対応していれば、互いにリンクすることが可能です。また、アセンブリ言語でコードを作成する場合でも、EABIに準拠することで、他のコードとの連携が保証されます。

EABIと汎用OS向けABIの違い



EABIと汎用OS向けABIの主な違いとして、以下の点が挙げられます。

アプリケーションコードでも特権命令の使用が許可される。
ダイナミックリンクが必須ではない(場合によっては完全に不可能)。
メモリを節約するために、スタックフレームがコンパクトに構成される。

EABIが用いられるCPUアーキテクチャ



EABIは、PowerPC、ARM、MIPSなどのCPUアーキテクチャで広く使用されています。

EABIの選択による性能への影響



EABIの選択は、プログラムの性能に影響を与える可能性があります。異なるEABIを採用すると、コンパイラによる最適化や、実行時の動作が異なるため、最適なEABIの選択は、組み込みシステムにおける重要な検討事項です。

ABI共通化の試みとその成果



Unix系OSでは、同じハードウェアプラットフォーム上で複数のOSが動作することがあります。例えば、POWER、MIPS、ItaniumなどのRISCチップでは、異なるOSが共存しています。

過去の試み



IA-32系では、OS間でABIを定義し、アプリケーションの相互動作を可能にする試みがなされましたが、成功には至っていません。Linuxでは、Linux Standard Base(LSB)がABIを含む多くの規定を試みていますが、完全な相互運用性の実現には至っていません。

MIPS系での成果



MIPS系では、複数のUnix系OSが乱立していたことから、何度もABIの共通化が試みられました。その一つとして、1990年代中盤から後半にかけて、NEC、Sony、住友電工、日本タンデムコンピュータなどにより、OCMP(Open Computing Environment for MIPS Platform)が定義されました。OCMPは、MIPS-ABIの日本語対応と、周辺機器の共通化を目的とし、一定の成果を上げました。

まとめ



ABIは、プログラムの移植性や相互運用性を確保するために不可欠な要素であり、その詳細な定義は、システムやプラットフォームによって異なります。EABIのように特定の用途に特化したABIも存在し、組み込みシステム開発においては、適切なABIの選択が重要となります。

関連項目



プログラミング (コンピュータ)
バイナリ
束縛 (情報工学)
SWIG

外部リンク



KDE Techbase Policies
Mac OS X ABI Function Call Guide
Debian ARM EABI port
µClib: Motorola 8/16-bit embedded ABI
AMD64 (x86-64) Application Binary Interface
Application Binary Interface (ABI) for the ARM Architecture
MIPS EABI documentation
Sun Studio 10 Compilers and the AMD64 ABI

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。