System V AMD64 psABI ドキュメントは、GitLab で LaTeX ソースとして管理されています。同様に、i386 psABI は別の GitLab リポジトリです。 (以前は github にありました)。これらのページには、リビジョンが議論されている場所に関する情報があります。
x32 ABI (ロング モードの 32 ビット ポインター) は、x86-64 別名 AMD64 ABI doc の一部です。第 10 章:ILP32 プログラミング モデルを参照してください。
GitLab リポジトリは 現在の x86-64 バージョンの PDF を自動ビルドします 、しかし i386 ではありません。
他のガイド/リファレンス/リンクについては、x86 タグ wiki も参照してください。
Github の最後のバージョンは x86-64 バージョン 1.0 ドラフト (2018 年 1 月) でした。 2022 年 7 月の時点で、現在のバージョンはまだ 1.0 であり、2018 年後半までにドラフトという単語が削除されます。
Github は、i386 ABI バージョン 1.1 の PDF もホストしています。
(Linux 以外のほとんどの OS は、16 バイトのスタック アラインメントを必要としない古いバージョンの i386 ABI を使用していることに注意してください。GCC は -mpreferred-stack-boundary=4
に依存することになりました。 その SSE コード生成の 16 バイト アラインメント (おそらく意図せず)、そして最終的に ABI が Linux 用に更新され、公式の要件としてそれが守られました。 GCC バグ #40838 に関するコメントで要約を試みました。これにより、他の関数を呼び出す手書きの asm との下位互換性が失われます。)
非公式には、32 ビットへの狭い引数の符号拡張が必要です (i386 と amd64 の両方で)。これは、clang がそれに依存しているためです。願わくば、将来の ABI リビジョンでそれが文書化されることを願っています。 GCC および/または clang には、それを制御するためのオプションがいくつかあります (TODO は、それらが呼び出されたものを掘り下げます) が、デフォルトは 2022 年の時点でも同じです。
命名:psABI
プロセッサ サプリメント (psABI) ドキュメントは、更新頻度の低い System V gABI (ジェネリック) を補足するものとして設計されており、SCO の Web サイトでホストされています。
その他のリンク
また、https://refspecs.linuxfoundation.org/ は 1997 年の gABI のコピーをホストしています。
https://uclibc.org/specs.html には、さまざまな非 x86 ISA の psABI リンクがあります。 (たとえば、ARM は ELF ファイルのレイアウトのみを文書化しているようですが、呼び出し規則やプロセスの起動状態は文書化していません。) https://uclibc.org/docs/psABI-x86_64.pdf は x86-64 の古いコピーです。 psABI (2014 年から 0.99.7)。 GitHub のバージョンでは、いくつかの例でいくつかのこととバグ修正についてより明確な文言が示されています。
関連:i386 および x86-64 での UNIX および Linux システム コール (およびユーザー空間関数) の呼び出し規約は何ですか x86-64 SysV (および i386 Linux 対 FreeBSD) のシステムコール呼び出し規則。
また、整数引数の関数呼び出し規則もまとめています。システム呼び出しは、FP または SSE/AVX ベクトル引数、または値による構造体を使用しないため、関数呼び出し規則はより複雑です。
Agner Fog の呼び出し規約ガイド (Windows と Sys V の比較、32 ビットのさまざまな規則、およびどちらのプラットフォームでも使用できる関数を作成するためのヒント/コツをカバーしています)。これは、彼の最適化とマイクロアーキテクチャのガイドと手順表 (パフォーマンスを気にする場合は必読です) とは別の PDF です。
ウィキペディアには、さまざまな規則について説明している x86 呼び出し規則の記事がありますが、ほとんどの場合、単純な整数引数以外にそれらを使用するには十分な詳細がありません。 (例:構造体パッキング規則の説明なし)。
関連:C++ アビ
GCC と Clang (すべてのアーキテクチャで) は、元々 Itanium 用に開発された C++ ABI を使用します。 https://itanium-cxx-abi.github.io/cxx-abi/。これは、たとえば、C++ 構造体/クラスがレジスターで渡される必要がある要件 (たとえば、定義によると集約である) と、構造体/クラスが常にアドレスを持ち、参照によって渡される必要がある場合に関連しています。 2 つのレジスタにパックするのに十分小さい場合。これらのルールは、自明でないコンストラクタまたはデストラクタを持つものに依存します。
Linux 標準ベース
Linux Standard Base には、この件に関して権威ある仕様と見なされるものもあり、7.2 というセクションがあります。 「関数呼び出しシーケンス」は 2.1 を指します。次のリンクを含む「規範的参照セクション」:
- System V アプリケーション バイナリ インターフェイス、エディション 4.1 http://www.sco.com/developers/devspecs/gabi41.pdf
- System V アプリケーション バイナリ インターフェイス - ドラフト - 2003 年 12 月 17 日 http://www.sco.com/developers/gabi/2003-12-17/contents.html
- System V Application Binary Interface AMD64 Architecture Processor Supplement、ドラフト バージョン 0.95 http://refspecs.linux-foundation.org/elf/x86_64-abi-0.95.pdf
したがって、特に理由がない限り、これらのバージョンの仕様を正規のものとして使用することをお勧めします。
現在のバージョン System V ABI の GitLab から簡単に素敵な PDF に変換できます Ubuntu システムを想定して、これらの手順を実行します。
sudo apt-get install texlive-full
git clone https://gitlab.com/x86-psABIs/x86-64-ABI
cd x86-64-ABI
make pdf
これにより、abi.pdf
というファイルが生成されます。 以下のように、まさにこれが必要です。
タイトルの日付は、ドキュメントの実際の最終変更日ではなく、PDF の作成日であることに注意してください。