2011-03-27 12 views
3

コンパイルとABIはどのように関連していますか?コンパイルとABIはどのように関連していますか?

アプリケーションバイナリインターフェイス(ABI)をOSやその他のアプリケーションにビルドするためのコンパイラのみの仕事ですか? Wikipediaから引用ABI約

のABIは、データ・タイプ、 サイズ、および配向などの詳細を覆います。 規約は、 関数の引数がどのように渡され、 戻り値が取得されるかを制御します。システム コール番号とアプリケーション が オペレーティングシステムへのシステムコールを行う方法。 の完全なオペレーティングシステムABIの場合は、オブジェクトファイルの バイナリ形式、プログラム ライブラリなどがあります。

ありがとうございました!

答えて

4

ABIには、基礎となるOSの機能が記述されており、プログラムのコンパイル方法に関する規則がいくつか含まれています。 ABIをビルドしないコンパイラの仕事ですが、には実行可能なコードを作成するため、ABIにを準拠させます。

+0

ありがとうございます!したがって、ABIはOSに属する仕様であり、CPUやその命令セット、コンパイラ、ソースコードが記述されている言語、プログラム/実行可能ファイルなどではありません。 – Tim

+0

はい。 OSのために修正されています。個々のプログラムはそれに全く貢献しません。ただそれに従います。 –

+0

ありがとうございます。私は以前のコメントに「CPUとその命令セット、コンパイラ、ソースコードが書かれている言語、プログラム/実行ファイルなど、他のものには属していません」と追加しました。 – Tim

2

コンパイラがABIを完全にフォローしないことがあります。有効なマシンコードを発行する必要がありましたが、たとえば内部関数呼び出しの呼び出し規約に従わない場合があります。もちろん、コンパイルされたコードとOSの境界では、コンパイラはABIに従うべきです。

+0

ありがとう!コンパイラがシステムのABIに完全に従っていない場合、システム上でコンパイルされたコードはシステム上で実行可能になりますか? – Tim

+0

「完全に」と言っていることに依存します。もしコンパイルされたアプリケーションが呼び出し関数を呼び出していても、何らかのエラーが発生するとしても、呼び出し規約にはまったく準拠していません。もう1つのケースは、アプリケーションが実行可能ファイル/ライブラリ形式に準拠していない場合です。つまり、ローダーがそのようなコンポーネントのロードに失敗するため、アプリケーションは実行されません。つまり、コンパイルされたアプリケーションがOSと相互作用する場所でABIをフォローしないと、問題が発生します。実行可能だが動作しない可能性があります。または仕事ではありますが絶対にそうではありません。 – xappymah

0

ソースからオブジェクトファイルを出力する必要があります。これは、アドレッシングモードの可用性、使用可能なレジスタ、ABI内で明示されるようなアーキテクチャなど、アーキテクチャに依存します。また、OSはパフォーマンス上の理由からアーキテクチャと密接に結びついているため、ファームウェアを記述していない限り、システムコール用のOSの呼び出し規約とそのような詳細情報はABIパーセルの一部です。

コンパイラは、高レベルのソーステキストをマシンレベルのオペコードとデータで置き換えます。出力は、ツールチェインに応じて準拠する必要があります。たとえば、Windowsをターゲットとするリンカは、WindowsライブラリをサポートするためのPE形式のオブジェクトファイルと、ツールチェーンのコンパイラがELFのような他の形式のいずれかに出力する場合の追加の形式を必要とします。

関連する問題