問題タブ [abi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 標準のABIを定義した場合、C / C ++は何を「失う」可能性がありますか?
タイトルはすべてを言います。特にC/C ++について話しているのは、どちらもこれを「実装の問題」と見なしているためです。標準のインターフェースを定義することで、その上にモジュールシステムを構築するのが簡単になると思います。
標準のABIを定義した場合、C / C ++は何を「失う」可能性がありますか?
c - C コンパイラは、大きな構造体を返す関数をどのように実装しますか?
関数の戻り値は通常、スタックまたはレジスタに格納されます。しかし、大きな構造体の場合、スタック上になければなりません。このコードを実際のコンパイラでコピーする必要があるのはどれくらいですか? それとも最適化されていますか?
例えば:
(関数をインライン化できないと仮定します..)
compiler-construction - アプリケーション バイナリ インターフェイス (ABI) とは何ですか?
ABIが何であるかを明確に理解したことがありません。ウィキペディアの記事を紹介しないでください。もし私がそれを理解することができれば、私はここにそのような長い投稿を投稿しないでしょう.
これは、さまざまなインターフェースに関する私の考え方です。
テレビのリモコンは、ユーザーとテレビの間のインターフェースです。これは既存のエンティティですが、それ自体では役に立ちません (機能を提供しません)。リモコンのこれらの各ボタンのすべての機能は、テレビ セットに実装されています。
インターフェイス:
functionality
とconsumer
その機能の間の「既存のエンティティ」レイヤー です。インターフェイス自体は何もしません。背後にある機能を呼び出すだけです。ユーザーが誰であるかに応じて、さまざまなタイプのインターフェイスがあります。
コマンド ライン インターフェイス (CLI)コマンドは既存のエンティティであり、コンシューマーはユーザーであり、機能は背後にあります。
functionality:
このインターフェイスを説明している目的を解決する私のソフトウェア機能。
existing entities:
コマンド
consumer:
ユーザーグラフィカル ユーザー インターフェイス (GUI)ウィンドウ、ボタンなどは既存のエンティティであり、消費者はユーザーであり、機能は背後にあります。
functionality:
このインターフェイスを説明している問題を解決する私のソフトウェア機能。
existing entities:
ウィンドウ、ボタンなど
consumer:
ユーザーアプリケーション プログラミング インターフェイス (API)関数 (より正確には) インターフェイス (インターフェイス ベースのプログラミング) は既存のエンティティであり、ここでのコンシューマーはユーザーではなく別のプログラムであり、機能はこのレイヤーの背後にあります。
functionality:
このインターフェイスを説明している問題を解決する私のソフトウェア機能。
existing entities:
関数、インターフェイス (関数の配列)。
consumer:
別のプログラム/アプリケーション。Application Binary Interface (ABI)ここから問題が始まります。
functionality:
???
existing entities:
???
consumer:
???
- 私はさまざまな言語でソフトウェアを作成し、さまざまな種類のインターフェイス (CLI、GUI、および API) を提供してきましたが、ABI を提供したことがあるかどうかはわかりません。
ABI は、次のような詳細をカバーします。
- データ型、サイズ、配置。
- 関数の引数がどのように渡され、戻り値が取得されるかを制御する呼び出し規則。
- システム コール番号と、アプリケーションがオペレーティング システムに対してシステム コールを行う方法。
その他の ABI は、次のような詳細を標準化します。
- C++ の名前マングリング、
- 例外の伝播、および
- 同じプラットフォーム上のコンパイラ間の呼び出し規約を呼び出しますが、クロスプラットフォームの互換性は必要ありません。
誰がこれらの詳細を必要としますか? OSは言わないでください。私はアセンブリプログラミングを知っています。リンクと読み込みの仕組みを知っています。私は内部で何が起こっているかを正確に知っています。
C++ の名前マングリングが登場したのはなぜですか? バイナリレベルで話していると思いました。言語はなぜ入ってくるのですか?
とにかく、[PDF] System V Application Binary Interface Edition 4.1 (1997-03-18)をダウンロードして、正確に何が含まれているかを確認しました。うーん、ほとんど意味不明でした。
ELFファイル形式を説明するために 2 つの章 (第 4 および第 5) が含まれているのはなぜですか? 実際、この仕様の重要な章は 2 つだけです。残りの章は「プロセッサ固有」です。とにかく、それはまったく別のトピックだと思いました。ELF ファイル形式の仕様がABIであるとは言わないでください。定義によると、インターフェイスとしての資格はありません。
私たちは非常に低いレベルで話しているので、それは非常に具体的でなければなりません。しかし、「命令セットアーキテクチャ(ISA)」固有の方法はわかりませんか?
Microsoft Windows の ABI はどこにありますか?
したがって、これらは私を悩ませている主要なクエリです。
linux - i386 および x86-64 での UNIX および Linux システム コール (およびユーザー空間関数) の呼び出し規則は何ですか?
次のリンクでは、UNIX (BSD フレーバー) と Linux の両方の x86-32 システム コール規則について説明しています。
しかし、UNIX と Linux の両方での x86-64 システム コールの規則は何ですか?
c - アセンブリ言語でcライブラリ関数fgetsを使用するにはどうすればよいですか?
タイトルで説明したように、アセンブリ言語でcライブラリ関数fgetsを使用するにはどうすればよいですか?確かに、stdinへのファイルポインタを取得する方法を知りたいです。お返事をありがとうございます。
c++ - GCC ABI の互換性
私の知る限り、異なるバージョンの GCC の Application Binary Interface (ABI) を使用するライブラリをリンクすることはできません。GCC のすべてのバージョンに ABI の変更はありますか? たとえば GCC 4.3.2 を使用している場合、4.3.1 でビルドされたライブラリをリンクすることはできますか? GCC のバージョンを組み合わせる方法をすべてリストしたマトリックスはありますか?
c++ - ABIの維持:コンストラクターを構造体に追加
共有ライブラリのリビジョン1には、次のABIを維持するために必要な構造体があります。
リビジョン2では、Personを次のように変更しています。
ソースの互換性を維持するために、Personのバージョン1を変更して、新しいヘッダーファイルに対してコンパイルされたコードが実行され、再コンパイルされていないコードが実行されるようにします。
2つの新しい非インラインコンストラクターを使用して次のことを実行できますか?
これはすべてg++で行っています。生成された共有ライブラリをnmで見ると、プレーン構造体のコンストラクタまたはデストラクタが表示されないため、再コンパイルされないコードは、以前と同じように呼び出し元のサイトでPersonを構築するだけだと思います。再コンパイルされるコードはすべて、引数なしのコンストラクターを使用します。
私が目にする唯一の問題は、コンストラクターを持たない古いバージョンの共有ライブラリにロールバックする必要がある場合、それに対してコンパイルされたコードはすべて壊れますが、この状況については心配していません。
gcc - ABI 呼び出し規約とアーキテクチャと混同する
私はこれらすべての用語と混同しています:
ABI、呼び出し規約、およびハードウェア アーキテクチャ。
ABI はアーキテクチャとリンクしています。x86-64 には、i386 とは異なる ABI があります。ただし、独自の呼び出し規約 cdecl を定義することもできます...
では、これらすべての概念の間のリンクは何ですか? どちらが他のものを定義していますか?
ほとんどの場合、私は ABI と混同していると思います。呼び出し規約の一部の中に何を入れますか?
ありがとう
abi - API と ABI の違い
私は Linux システム プログラミングは初めてで、 Linux System Programmingを読んでいるときに API と ABI に出会いました。
API の定義:
API は、あるソフトウェアがソース レベルで別のソフトウェアと通信するためのインターフェイスを定義します。
ABIの定義:
API はソース インターフェイスを定義しますが、ABI は特定のアーキテクチャ上の 2 つ以上のソフトウェア間の低レベル バイナリ インターフェイスを定義します。アプリケーションがそれ自体と対話する方法、アプリケーションがカーネルと対話する方法、およびアプリケーションがライブラリと対話する方法を定義します。
プログラムはソースレベルでどのように通信できますか? ソースレベルとは?それは何らかの形でソースコードに関連していますか? または、ライブラリのソースがメイン プログラムに含まれますか?
私が知っている唯一の違いは、API は主にプログラマーによって使用され、ABI は主にコンパイラーによって使用されることです。
c - C コンパイラは、ポインタが 32 ビットである実行可能な 64 ビットを生成できますか?
ほとんどのプログラムは 4GB 未満のアドレス空間にうまく適合しますが、x64 アーキテクチャで利用可能な新しい機能を使用する必要があります。
x64 レジスタと特定の命令を使用できるが、メモリを節約するために 32 ビット ポインターを保持できるコンパイラ/プラットフォームはありますか?
レガシーコードで透過的にそれを行うことは可能ですか? それを行うためのスイッチは何ですか?
また
32 ビット ポインターを維持しながら 64 ビット機能を取得するには、コードのどのような変更が必要ですか?