Das System V AMD64 psABI-Dokument wird als LaTeX-Quelle auf GitLab verwaltet. Ebenso ist das i386 psABI ein separates GitLab-Repo. (Früher auf github). Diese Seiten enthalten Informationen darüber, wo Überarbeitungen diskutiert werden.
Die x32-ABI (32-Bit-Zeiger im Long-Modus) ist Teil der x86-64-auch bekannt als AMD64-ABI-Dokumentation. Siehe Kapitel 10:ILP32-Programmiermodell.
Das GitLab-Repository erstellt automatisch eine PDF-Datei der aktuellen x86-64-Version , aber nicht i386.
Siehe auch das x86-Tag-Wiki für weitere Anleitungen/Referenzen/Links.
Die letzte Version auf Github war x86-64 Version 1.0 Entwurf (Januar 2018). Ab Juli 2022 ist die aktuelle Version immer noch 1.0, wobei das Wort Entwurf bis Ende 2018 entfernt wird.
Github hostet auch ein PDF von i386 ABI Version 1.1.
(Beachten Sie, dass die meisten Nicht-Linux-Betriebssysteme eine ältere Version der i386-ABI verwenden, die keine 16-Byte-Stack-Ausrichtung erfordert, sondern nur 4. GCC hängt schließlich von -mpreferred-stack-boundary=4
ab 16-Byte-Ausrichtung für seine SSE-Code-Gen (vielleicht unbeabsichtigt), und schließlich wurde die ABI für Linux aktualisiert, um dies als offizielle Anforderung zu verankern. Ich habe versucht, eine Zusammenfassung in einem Kommentar zum GCC-Fehler #40838 zu erstellen. Dies unterbricht die Abwärtskompatibilität mit einem handgeschriebenen asm, das andere Funktionen aufruft.)
Inoffiziell ist die Vorzeichenerweiterung von schmalen Argumenten auf 32 Bit erforderlich (sowohl für i386 als auch für amd64), da Clang davon abhängt. Hoffentlich wird eine zukünftige ABI-Revision dies dokumentieren. GCC und/oder Clang haben jetzt einige Optionen, um dies zu steuern (TODO findet heraus, wie sie genannt wurden), aber die Standardeinstellung ist immer noch die gleiche wie im Jahr 2022.
Namensgebung:psABI
Die Prozessor-Ergänzung (psABI)-Dokumente sind als Ergänzung zu dem weniger häufig aktualisierten System V gABI (generisch) konzipiert, das auf der SCO-Website gehostet wird.
Weitere Links
Auch https://refspecs.linuxfoundation.org/ hostet eine Kopie des gABI von 1997.
https://uclibc.org/specs.html enthält psABI-Links für verschiedene Nicht-x86-ISAs. (Obwohl zum Beispiel der ARM nur das Layout der ELF-Datei zu dokumentieren scheint, nicht die Aufrufkonvention oder den Startzustand des Prozesses.) https://uclibc.org/docs/psABI-x86_64.pdf ist eine veraltete Kopie des x86-64 psABI (0.99.7 von 2014). Die Version auf GitHub hat in einigen Beispielen klarere Formulierungen und Bugfixes.
Siehe auch:Was sind die Aufrufkonventionen für UNIX- und Linux-Systemaufrufe (und User-Space-Funktionen) auf i386 und x86-64? die Systemaufruf-Aufrufkonvention für x86-64 SysV (sowie i386 Linux vs. FreeBSD).
Es fasst auch die Funktionsaufrufkonventionen für Integer-Argumente zusammen. Systemaufrufe nehmen keine FP- oder SSE/AVX-Vektorargumente oder Structs nach Wert, daher ist die Funktionsaufrufkonvention komplizierter.
Agner Fog hat einen Leitfaden für Anrufkonventionen (Abdeckung von Windows vs. Sys V und die verschiedenen Konventionen für 32-Bit sowie Tipps/Tricks zum Schreiben von Funktionen, die Sie auf beiden Plattformen verwenden können). Dies ist ein separates PDF von seinen Optimierungs- und Mikroarchitekturhandbüchern und Anweisungstabellen (die unbedingt gelesen werden müssen, wenn Ihnen Leistung wichtig ist.)
Wikipedia hat einen Artikel über x86-Aufrufkonventionen, der verschiedene Konventionen beschreibt, aber meistens nicht detailliert genug, um sie für etwas anderes als einfache Integer-Argumente zu verwenden. (z. B. keine Beschreibung von Struct-Packing-Regeln).
Verwandt:C++ ABI
GCC und Clang (auf allen Architekturen) verwenden die ursprünglich für Itanium entwickelte C++-ABI. https://itanium-cxx-abi.github.io/cxx-abi/. Dies ist beispielsweise relevant dafür, welche Anforderungen eine C++-Struktur/Klasse in Registern übergeben werden muss (z. B. um ein Aggregat gemäß einer Definition zu sein), im Vergleich dazu, wann eine Struktur/Klasse immer eine Adresse haben und sogar als Referenz übergeben werden muss wenn es klein genug ist, um es in 2 Register zu packen. Diese Regeln hängen davon ab, ob Dinge einen nicht-trivialen Konstruktor oder Destruktor haben.
Linux-Standardbasis
Die Linux Standard Base, die von einigen als maßgebliche Spezifikation für diese Angelegenheit angesehen werden kann, hat einen Abschnitt namens 7.2. "Function Calling Sequence" zeigt auf die 2.1. Abschnitt „Normative Verweise“, der die folgenden Links enthält:
- System V Application Binary Interface, Edition 4.1 http://www.sco.com/developers/devspecs/gabi41.pdf
- System V Application Binary Interface – ENTWURF – 17. Dezember 2003 http://www.sco.com/developers/gabi/2003-12-17/contents.html
- System V Application Binary Interface AMD64 Architecture Processor Supplement, Draft Version 0.95 http://refspecs.linux-foundation.org/elf/x86_64-abi-0.95.pdf
Ich würde daher empfehlen, diese Versionen der Spezifikationen als die kanonischen zu verwenden, es sei denn, Sie haben gute Gründe, anders zu handeln.
Die aktuelle Version des System V ABI von GitLab kann leicht in ein schönes PDF umgewandelt werden mit diesen Schritten, vorausgesetzt ein Ubuntu-System.
sudo apt-get install texlive-full
git clone https://gitlab.com/x86-psABIs/x86-64-ABI
cd x86-64-ABI
make pdf
Dies erzeugt eine Datei namens abi.pdf
das ist genau das, was benötigt wird, wie unten.
Beachten Sie, dass das Datum im Titel das Erstellungsdatum der PDF-Datei zu sein scheint und nicht das tatsächliche Datum der letzten Änderung des Dokuments.