x86-64 System V ABI 的文档在哪里可以找到?

89

x86-64 System V ABI(用于除Windows之外的所有系统)曾经存放在http://x86-64.org/documentation/abi.pdf上,但该网站现已失效。

是否有新的权威站点提供该文档?


2
我所知道的最新版本是 0.99.6。为了避免引用页面上的链接失效,请尝试这里 - Brett Hale
http://agner.org/optimize/calling_conventions.pdf - Elalfer
5
也想知道背景故事。http://web.archive.org/web/20160609221003/http://www.x86-64.org/documentation/assembly.html仍然是一个非常有用的x86-64新手指南,适合那些跟随32位教程并对x86-64感到困惑的人。很高兴Wayback机器存在。 - Peter Cordes
3个回答

96
System V AMD64 psABI文档是以LaTeX源代码形式维护的(GitLab链接)。同样,i386 psABI是一个独立的GitLab存储库。(以前在GitHub上)。这些页面提供了有关修订讨论的信息。
x32 ABI(长模式下的32位指针)是x86-64 aka AMD64 ABI文档的一部分。请参见第10章:ILP32编程模型。
GitLab存储库自动构建当前x86-64版本的PDF,但不包括i386。

另请参阅 标签维基,以获取其他指南/参考/链接。


Github上的最新版本是x86-64版本1.0草案(2018年1月)。截至2022年7月,当前版本仍为1.0,草案一词在2018年末被删除。
Github还托管了i386 ABI版本1.1的PDF文档
(请注意,大多数非Linux操作系统使用旧版本的i386 ABI,不需要16字节的堆栈对齐,只需4个字节。GCC最终依赖于-mpreferred-stack-boundary=4 16字节对齐用于其SSE代码生成(可能是无意中),最终ABI更新为在Linux上将其作为官方要求。我在GCC错误#40838的评论中尝试了一个摘要。这会破坏某些手写汇编调用其他函数的向后兼容性。)

非官方地说,将窄参数符号扩展到32位是必需的(对于i386和amd64),因为clang依赖它。希望未来的ABI修订能够记录下来。GCC和/或clang现在有一些选项来控制这个(TODO找出它们的名称),但默认值仍然与2022年相同。


命名:psABI

处理器补充规范 (psABI) 文档是System V gABI(通用)的补充,旨在帮助更好地理解和更新该规范,该规范托管在SCO网站上。


其他链接

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上的版本在一些内容上有更清晰的措辞和一些示例中的错误修复。


相关: UNIX和Linux系统调用(以及用户空间函数)在i386和x86-64上的调用约定是什么?描述了x86-64 SysV的系统调用调用约定(以及i386 Linux vs. FreeBSD)。

它还总结了整数参数的函数调用约定。 系统调用不接受FP或SSE / AVX向量参数,也不接受按值传递的结构体,因此函数调用约定更加复杂。


Agner Fog的调用约定指南(涵盖Windows vs. Sys V,以及32位的各种约定,以及编写可在任何平台上使用的函数的技巧和窍门)。这是他优化和微体系结构指南以及指令表的单独PDF文件(如果您关心性能,则必须阅读)。
维基百科有一个x86调用约定文章,描述了各种约定,但大多数情况下没有足够的细节来用于除简单整数参数外的其他内容(例如,没有结构体打包规则的描述)。

相关: C++ ABI

GCC和Clang(在所有架构上)使用最初为Itanium开发的C++ ABI。 https://itanium-cxx-abi.github.io/cxx-abi/。例如,这与C++结构/类需要满足哪些要求才能通过寄存器传递(例如根据某些定义成为聚合体),以及何时需要始终具有地址并通过引用传递结构/类有关,即使它足够小可以打包到2个寄存器中。这些规则取决于某些内容是否具有非平凡的构造函数或析构函数。


1
X32 ABI位于X32 System V应用程序二进制接口。这是一个Google网站,而不是GitHub;但它似乎由H.J. Lu维护。我想知道为什么X32不在同一个地方。 - jww
1
@jww:x32在主x86-64 psABI PDF的第10章中有详细说明,至少在当前的0.99.8版本中是这样。也许它曾经是一个单独的PDF文件。 - Peter Cordes
这是Intel版本 - phuclv
3
该 Github 页面现在指向 https://gitlab.com/x86-psABIs/x86-64-ABI 。不幸的是,似乎不再有预构建的 PDF 文件了。 - Nate Eldredge
1
使用预构建的软件,最新的x86-64 PDF链接如下:https://gitlab.com/x86-psABIs/x86-64-ABI/-/jobs/artifacts/master/raw/x86-64-ABI/abi.pdf?job=build,但没有i386的链接。 - Sebastian
显示剩余2条评论

6

Linux标准基础

Linux标准基础(LSB)可以被视为权威规范,其中有一个称为“函数调用顺序”的部分,指向包含以下链接的“2.1规范参考部分”

因此,我建议使用这些规范的版本作为标准,除非您有充分的理由选择其他版本。


4

可以通过以下步骤,在Ubuntu系统下将来自GitLabSystem V ABI当前版本轻松转换为漂亮的PDF

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的生成日期而不是文档的实际最后修改日期。 enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接