web-dev-qa-db-fra.com

Où l'ABI x86-64 System V est-il documenté?

L'ABI x86-64 System V (utilisé sur tout sauf Windows) vivait à http://x86-64.org/documentation/abi.pdf , mais ce site est maintenant tombé hors d'Internet .

Existe-t-il un nouveau site faisant autorité pour le document?

46
Jeffrey Yasskin

Le System V x86-64 psABI est maintenu sur GitHub. La page github de H.J. Lu a n wiki avec des liens vers les versions actuelles des documents psABI x86-64 et i386 SystemV, et vers les forums où les mises à jour sont discutées.

Voir aussi x86tag wiki pour des liens directs vers les dernières versions.

À partir de maintenant, le courant la version pour x86-64 est 1.0 (janvier 2018) . Il y a une déc 2018 plus récente version préliminaire qui (ironiquement) supprime le "brouillon" du numéro de version "brouillon 1.0" dans le PDF lui-même).
L'ABI x32 (pointeurs 32 bits en mode long) fait partie du document ABI x86-64. Voir Chapitre 10: Modèle de programmation ILP32.

La version actuelle de i386 est 1.1 . (Notez que certains systèmes d'exploitation utilisent une ancienne version de l'i386 ABI qui ne nécessite pas d'alignement de pile sur 16 octets, seulement 4. GCC a fini par dépendre de -mpreferred-stack-boundary=4 Alignement de 16 octets pour son code SSE code-gen (peut-être involontairement), et finalement l'ABI a été mis à jour pour Linux pour en faire une exigence officielle. J'ai tenté un résumé dans un - commentaire sur le bogue GCC # 40838 . Cela rompt la compatibilité avec certains asm écrits à la main qui appellent d'autres fonctions.)

Officieusement, des arguments étroits étendant le signe à 32 bits sont requis (pour i386 et AMD64), car le clang en dépend. J'espère qu'une future révision ABI documentera cela.


Désignation: psABI

Les documents sur le supplément du processeur (psABI) sont conçus comme un complément à la mise à jour moins fréquente System V gABI (générique), hébergée sur le site Web de SCO.


Autres liens

Aussi https://refspecs.linuxfoundation.org/ héberge une copie du gABI de 1997.

https://uclibc.org/specs.html a des liens psABI pour diverses ISA non x86. (Bien que par exemple le ARM on ne semble documenter que la disposition du fichier ELF, pas la convention d'appel ou l'état de démarrage du processus.) https://uclibc.org/docs/psABI -x86_64.pdf est une copie obsolète du psABI x86-64 (0.99.7 à partir de 2014). La version sur GitHub a une formulation plus claire de quelques éléments et corrections de bugs dans certains exemples.


Connexes: Quelles sont les conventions d'appel pour les appels système UNIX et Linux sur i386 et x86-64 décrit la convention d'appel système pour x86-64 SysV (ainsi que i386 Linux vs FreeBSD).

Il résume également les conventions d'appel de fonction pour les arguments entiers. Les appels système ne prennent pas FP ou args vectoriels SSE/AVX, ou structs par valeur, donc la convention d'appel de fonction est plus compliquée.


Agner Fog a un guide des conventions d'appel (couvrant Windows vs Sys V, et les diverses conventions pour 32 bits, et trucs/astuces pour écrire des fonctions que vous pouvez utiliser sur l’une ou l’autre plateforme). Ceci est un PDF PDF séparé de ses guides d'optimisation et de microarchitecture et des tableaux d'instructions (qui sont des lectures essentielles si vous vous souciez des performances.)

Wikipedia a un x86 conventions d'appel article qui décrit diverses conventions, mais la plupart du temps pas assez en détail pour les utiliser pour autre chose que de simples arguments entiers. (par exemple, aucune description des règles de struct-packaging).


Connexes: C++ ABI

GCC et Clang (sur toutes les architectures) utilisent l'ABI C++ développé à l'origine pour Itanium. https://itanium-cxx-abi.github.io/cxx-abi/ . Ceci est pertinent par exemple pour quelles exigences une structure/classe C++ doit être passée dans les registres (par exemple être un agrégat selon une définition).

44
Peter Cordes

Base standard Linux

Le Linux Standard Base , qui peut être considéré par certains comme faisant autorité dans ce domaine, a une section appelée 7.2. "Function Calling Sequence" pointe vers le 2.1 . "Section Références normatives" qui contient les liens suivants:

Je recommanderais donc d'utiliser ces versions des spécifications comme celles canoniques, sauf si vous avez de bonnes raisons de faire autrement.