System V AMD 64 psABI文档作为LaTeX源on GitLab进行维护。同样,i386 psABI是一个单独的GitLab repo。(以前在github上)。这些页面提供了讨论修订的信息。 x32 ABI(长模式下的32位指针)是x86-64(又称AMD 64 ABI)文档的一部分。请参阅第10章:ILP 32编程模型。 GitLab存储库会自动构建**a PDF of the current x86-64 version**,但不会构建i386。 另请参阅x86tag wiki以获取其他指南/参考资料/链接。 Github上一个版本是x86-64 version 1.0 draft (January 2018),截至2022年7月,目前的版本仍然是1.0,Draft一词在2018年底被删除。 Github也有一个i386 ABI version 1.1的PDF文件。 (Note大多数非Linux操作系统使用i386 ABI的旧版本,它不需要16字节堆栈对齐,仅需要4。GCC最终依赖于-mpreferred-stack-boundary=4 16字节对齐来生成SSE代码(也许无意),并且最终ABI得到了针对Linux的更新,将其作为官方要求。我试图在GCC bug #40838的评论中进行总结。这破坏了与一些调用其他函数的手写asm的向后兼容性。) 非正式地,需要将窄参数符号扩展到32位(i386和amd 64),因为clang依赖于它。希望未来的ABI修订版会记录这一点。GCC和/或clang现在有一些选项来控制这一点(TODO挖掘它们的名称),但默认值仍然与2022年相同。
命名:前列腺特异性ABI
处理器补充 *(psABI)文档旨在补充SCO网站上不常更新的System V gABI(通用)。 其他链接
3条答案
按热度按时间igetnqfo1#
System V AMD 64 psABI文档作为LaTeX源on GitLab进行维护。同样,i386 psABI是一个单独的GitLab repo。(以前在github上)。这些页面提供了讨论修订的信息。
x32 ABI(长模式下的32位指针)是x86-64(又称AMD 64 ABI)文档的一部分。请参阅第10章:ILP 32编程模型。
GitLab存储库会自动构建**a PDF of the current x86-64 version**,但不会构建i386。
另请参阅x86tag wiki以获取其他指南/参考资料/链接。
Github上一个版本是x86-64 version 1.0 draft (January 2018),截至2022年7月,目前的版本仍然是1.0,Draft一词在2018年底被删除。
Github也有一个i386 ABI version 1.1的PDF文件。
(Note大多数非Linux操作系统使用i386 ABI的旧版本,它不需要16字节堆栈对齐,仅需要4。GCC最终依赖于
-mpreferred-stack-boundary=4
16字节对齐来生成SSE代码(也许无意),并且最终ABI得到了针对Linux的更新,将其作为官方要求。我试图在GCC bug #40838的评论中进行总结。这破坏了与一些调用其他函数的手写asm的向后兼容性。)非正式地,需要将窄参数符号扩展到32位(i386和amd 64),因为clang依赖于它。希望未来的ABI修订版会记录这一点。GCC和/或clang现在有一些选项来控制这一点(TODO挖掘它们的名称),但默认值仍然与2022年相同。
命名:前列腺特异性ABI
其他链接
此外,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上的版本对一些事情有更清晰的措辞,并在一些示例中修复了错误。
相关:* What are the calling conventions for UNIX & Linux system calls (and user-space functions) on i386 and x86-64描述了 * x86-64 SysV(以及i386 Linux与FreeBSD)的系统调用调用约定。
系统调用不接受FP或SSE/AVX向量参数,也不接受按值的结构体,因此函数调用的约定更加复杂。
Agner Fog has a calling conventions guide(涵盖Windows与Sys V、32位的各种约定,以及编写可在两种平台上使用的函数的技巧/窍门)。这是他的优化和微体系结构指南以及指令表(如果您关心性能,这些是必不可少的阅读材料)的单独PDF。
维基百科有一篇x86 calling conventions文章描述了各种约定,但大多数都不够详细,无法将其用于简单的整数参数以外的任何内容(例如,没有描述结构打包规则)。
相关:C++ ABI语言
GCC和叮当声(在所有体系结构上)使用最初为Itanium. https://itanium-cxx-abi.github.io/cxx-abi/开发的C++ ABI。例如,这与C++结构/类需要在寄存器中传递的要求相关(例如,根据某些定义是聚合),与结构/类总是需要具有地址并通过引用传递时相比,即使它小到可以装入两个寄存器。这些规则依赖于具有非平凡构造函数或析构函数的东西。
jtjikinw2#
Linux标准基础
Linux Standard Base(可被某些权威规范视为此问题的标准)包含名为7.2. "Function Calling Sequence"的章节,指向2.1.“规范性参考章节”,其中包含以下链接:
因此,我建议使用规范的那些版本作为规范版本,除非您有很好的理由不这样做。
qq24tv8q3#
GitLab的System V ABI的当前版本可以通过这些步骤轻松转换为PDF(假设使用Ubuntu系统)。
这将生成一个名为
abi.pdf
的文件,该文件正是所需的文件,如下所示。请注意,标题中的日期显示为PDF的构建日期,而不是文档的实际最后修改日期。