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