ABIがユーザースペースアプリケーションを開発する上で重要なコンテキストである理由がわかりません。オペレーティングシステムに対する一連のシステムコールはABIと見なされますか?しかし、もしそうなら、システムコールに関するすべての複雑さは標準ライブラリ内にカプセル化されていませんか?
では、システムコールはバイナリに埋め込まれるため、 ABIの互換性は、静的にリンクされたアプリケーションを異なるプラットフォームで実行する場合にのみ関係しますか?
ABIがユーザースペースアプリケーションを開発する上で重要なコンテキストである理由がわかりません。オペレーティングシステムに対する一連のシステムコールはABIと見なされますか?しかし、もしそうなら、システムコールに関するすべての複雑さは標準ライブラリ内にカプセル化されていませんか?
では、システムコールはバイナリに埋め込まれるため、 ABIの互換性は、静的にリンクされたアプリケーションを異なるプラットフォームで実行する場合にのみ関係しますか?
ABIは、システムに共通の一連のアライメント、呼び出し規約、およびデータ型を定義します。これにより、何らかの動的リンクを実行している場合、ABIは非常に重要になります。それがないと、あるアプリケーションからのコードには、別のアプリケーションから提供されたコードを呼び出す方法がありません。
だから、いや。ABIの互換性は、すべてのダイナミックリンクに関連しています(静的リンクにはあまり関係ありません)。
システムのABIは、アプリケーション間の作業だけでなく、アプリケーションからオペレーティングシステムへの作業にも影響を与えることを再度強調する価値があります。
ABIは、システムコールが利用できる以上のものです。また、通常、引数が関数に渡される実際の方法、および構造体とオブジェクトがメモリ内にどのように配置されるかについても説明します。一貫性のあるABIがないと、異なるコンパイラーによってビルドされたコードが相互に呼び出すことができない場合があります。foo(a、b)を呼び出し、1つのコンパイラーがaとbをスタックにプッシュし、別のコンパイラーがそれらをレジスターに渡すと、 ABIの衝突。
「ABI」(ウィキペディアを参照)は、オペレーティングシステムがデータ形式に関して行うすべての仮定の総称です。これには、実行可能ファイルのレイアウトと、C定義が与えられたメモリ内の任意のデータ構造のレイアウトが含まれます。
この用語は通常、同じ言語で書かれたプログラム間のフォーマット要件もカバーします。各言語には、実行可能形式とメモリ構造内で異なる規則が生じる可能性のある特定の機能がありますが、最終的には、OSと互換性のある実行可能ファイルとプロセッサの命令セットと互換性のあるデータ構造を生成する必要があります。
標準に準拠したコードのコンパイルのみに関心がある場合、ABIはそれほど重要ではありません。char *
標準に違反し、をにキャストするなどの移植性のないことを行う場合は、少し重要ですlong *
。大量のアセンブリコードを作成する場合は、さらに重要です。リンカやデバッガのようなものを書くと、実行する作業の大部分を具体化するようになる可能性があります。
互換性のないABIは、OSX、Linux、Solaris、Windows、および*BSDがすべてIntelx86 CPUで実行されているにもかかわらず、ベンダー固有または独自のシステムコールやライブラリを使用しない1つのOSでコンパイルされた単純なPOSIXのみのhelloworldプログラムである理由です。通常、別のOS *用にコンパイルすると、あるOSでは実行できません。
MacでWindowsアプリを実行できないことはすでに本能的にわかっているため、ABIはプログラマーにとってそれほど重要ではありません。非プログラマー(ハリウッドの脚本家を除く)でさえ、これを知っています。特定の環境をターゲットにする必要がある場合は、コンパイラの作成者にとって重要です。
*注:LinuxやBSDなどの一部のOSは、外部ABIをサポートしているため、単純なLinuxコマンドラインプログラムを変更せずにBSDで実行できる場合があります。そしてもちろん、ワインのようなエミュレーションレイヤーもあります。
C ++では、名前マングリングの実装方法がABIの一部であることを忘れないでください。
バイナリを再コンパイルせずに他の環境で実行したい場合にのみ、ABIを考慮に入れる必要がある場所がいくつかあります。
プログラムで3番目のライブラリを呼び出すことができ、3番目のライブラリは環境によって異なる場合があります。(信頼できるABIのみ)
OSへのシステムコール。(syscallをバイナリに静的にリンクし、代わりにlibcに動的にリンクする場合)
実際、ほとんどの開発者はABIを考慮する必要はなく、バイナリローダー/ツール開発者だけがABIについて詳しく知る必要があります。
システムコールもABIに従います。syscallインターフェイスはオペレーティングシステムごとに異なります。
アプリケーションと標準ライブラリを静的にリンクすると、アプリケーションが1つのsyscallABIに結び付けられます。たとえば、FreeBSDでは、エミュレーションモジュールを介してのみLinuxシステムコールABIを使用できます。