この PDF ( Application Binary Interface for the ARM Architecture: The Base Standard ) を見れば見るほど、その意味がわかりません。また、 Procedure Call Standard for the ARM ArchitectureとELF for the ARM Architectureについてコメントをお願いします。
3 に答える
ABI(Application Binary Interface)は、高水準言語の低水準概念と特定のハードウェア/OSプラットフォームのマシンコードの機能との間のマッピングを定義する標準です。これには次のようなものが含まれます。
- C / C ++ / Fortran / ...データ型がメモリにどのように配置されるか(データサイズ/配置)
- ネストされた関数呼び出しがどのように機能するか(関数の呼び出し元に戻る方法に関する情報が保存される場所と方法、CPUレジスタおよび/またはメモリ内の関数引数が渡される場所)
- プログラムの起動/初期化のしくみ(「実行可能ファイル」のデータ形式、そこからのコード/データのロード方法、DLLのしくみ...)
これらに対する答えは次のとおりです。
- 言語固有(したがって、C ABI、C ++ ABI、Fortran ABI、Pascal ABIなどがあります...実際のハードウェアではなく「仮想」プロセッサを対象としていますが、Javaバイトコード仕様でさえABIです)、
- オペレーティングシステム固有(同じハードウェア上のMS WindowsとLinuxは異なるABIを使用します)、
- ハードウェア/CPU固有(ARMとx86 ABIは異なります)。
- (長い)時間の経過とともに進化する(たとえば、アプリがx86 SSEレジスタをどのように使用するかを指定するなど、新しいCPU機能を利用できるように、既存のABIは更新/改訂されることがよくあります。もちろん、これは1回だけ可能でした。 CPUにはこれらの登録があったため、既存のABIを明確にする必要がありました)。
ある種のこの標準化がなければ、異なるコンパイラによって作成された(マシン)コードは同じ種類のライブラリを使用できませんでした(ライブラリコードが関数の引数またはデータ構造が渡されることをどのように期待するかをどのように知ることができますか?)。
すべてのプラットフォーム(特定のハードウェア、オペレーティングシステムソフトウェア、および特定のプログラミング言語で記述された/特定のコンパイラでコンパイルされたコードの組み合わせ)は、相互運用可能にするためにABIのセット全体を定義します。この分野の用語は明確ではありません。「ABI」について話す人もいれば、「プラットフォームサプリメント」と呼ばれる人もいれば、プログラミング言語について言及して「C++ABI」などと言う人もいます。そのようなことは1つではないことを覚えておいてください。
質問でリンクしたドキュメントはすべて、この特定の例です(言語/オペレーティングシステム/ハードウェア固有のABI)。
特定のプラットフォーム上でも、 ABI(セット)を1つだけ持つ必要はありません。これは、そのような規則が異なると利点が異なる可能性があるためです(したがって、プログラムによっては、パフォーマンスの向上/コードの削減/メモリ使用量の向上/ ...-プログラムによって異なります)システム設計者は通常、柔軟で許容できるように努めます。
たとえば、32ビットのMicrosoft Windowsには、関数呼び出し規約の部分用の多数のABI(fastcall、stdcall、pascalなど)があります。
とにかく、「ABI」の一般的なスタックオーバーフロー検索(「関連」サイドバーの下のリンクを含む)は、この質問の調査に非常に多くのリードを与えるので、この時点で答えを閉じます。