web-dev-qa-db-ja.com

x86-64 System V ABIはどこに文書化されていますか?

X86-64 System V ABI(Windows以外のすべてで使用)は http://x86-64.org/documentation/abi.pdf に住んでいましたが、そのサイトはインターネットから脱落しています。

ドキュメントの新しい信頼できるホームはありますか?

46
Jeffrey Yasskin

System V x86-64 psABIはGitHubで管理されています。 H.J. Luのgithubページには、x-86-64およびi386 SystemV psABIドキュメントの 現在のバージョンへのリンクがあるwiki と、更新が議論されているフォーラムがあります。

最新バージョンへの直接リンクについては、 x86タグwiki も参照してください。

現在、現在の x86-64のバージョンは1.0(2018年1月) です。より最近の2018年12月があります。 (皮肉にも)PDF自体の「ドラフト1.0」バージョン番号から「ドラフト」を削除するドラフトバージョン。
x32 ABI(ロングモードの32ビットポインター)は、x86-64 ABIドキュメントの一部です。第10章:ILP32プログラミングモデルを参照してください。

i386は1.1 の現在のバージョン。 (一部のOSは16バイトのスタックアライメントを必要としない古いバージョンのi386 ABIを使用していることに注意してください。4のみです。GCCは-mpreferred-stack-boundary=4 SSE code-gen(おそらく意図せずに)のための16バイトのアラインメント、そして最終的にはABIがLinux向けに更新され、公式要件としてそれを明記するようになりました。 GCCバグ#40838のコメント 。これにより、他の関数を呼び出す手書きのasmとの互換性が損なわれます。)

非公式には、clangがそれに依存しているため、 2ビットに符号拡張する狭い引数が必要 (i386とAMD64の両方)うまくいけば、将来のABI改訂でそれが文書化されることを期待しています。


命名:psABI

プロセッササプリメント(psABI)のドキュメントは、SCOのWebサイトでホストされている、それほど頻繁に更新されない System V gABI (汎用)の補足として設計されています。


その他のリンク

また、 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++ABI

GCCとClang(すべてのアーキテクチャ上)は、Itanium用に最初に開発されたC++ ABIを使用します。 https://itanium-cxx-abi.github.io/cxx-abi/ 。これは、たとえば、C++の構造体/クラスをレジスターで渡す必要がある要件(たとえば、ある定義による集合体)に関連しています。

44
Peter Cordes

Linux標準ベース

Linux Standard Base は、この問題の信頼できる仕様の一部と見なすことができます 7.2。「関数呼び出しシーケンス」2.1を指します。 。 "規定参照セクション" 以下のリンクが含まれます。

したがって、特に理由がない限り、これらのバージョンの仕様を正規のものとして使用することをお勧めします。