x86-64 System V ABI(用于除Windows之外的所有系统)曾经存放在http://x86-64.org/documentation/abi.pdf上,但该网站现已失效。
是否有新的权威站点提供该文档?
x86-64 System V ABI(用于除Windows之外的所有系统)曾经存放在http://x86-64.org/documentation/abi.pdf上,但该网站现已失效。
是否有新的权威站点提供该文档?
-mpreferred-stack-boundary=4
16字节对齐用于其SSE代码生成(可能是无意中),最终ABI更新为在Linux上将其作为官方要求。我在GCC错误#40838的评论中尝试了一个摘要。这会破坏某些手写汇编调用其他函数的向后兼容性。)
非官方地说,将窄参数符号扩展到32位是必需的(对于i386和amd64),因为clang依赖它。希望未来的ABI修订能够记录下来。GCC和/或clang现在有一些选项来控制这个(TODO找出它们的名称),但默认值仍然与2022年相同。
处理器补充规范 (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向量参数,也不接受按值传递的结构体,因此函数调用约定更加复杂。
GCC和Clang(在所有架构上)使用最初为Itanium开发的C++ ABI。 https://itanium-cxx-abi.github.io/cxx-abi/。例如,这与C++结构/类需要满足哪些要求才能通过寄存器传递(例如根据某些定义成为聚合体),以及何时需要始终具有地址并通过引用传递结构/类有关,即使它足够小可以打包到2个寄存器中。这些规则取决于某些内容是否具有非平凡的构造函数或析构函数。
Linux标准基础
Linux标准基础(LSB)可以被视为权威规范,其中有一个称为“函数调用顺序”的部分,指向包含以下链接的“2.1规范参考部分”:
因此,我建议使用这些规范的版本作为标准,除非您有充分的理由选择其他版本。
可以通过以下步骤,在Ubuntu系统下将来自GitLab的System 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
的文件,这正是所需的文件,如下所示。