x86-64 System V ABI 记录在哪里?

Posted

技术标签:

【中文标题】x86-64 System V ABI 记录在哪里?【英文标题】:Where is the x86-64 System V ABI documented? 【发布时间】:2013-08-10 15:00:49 【问题描述】:

x86-64 System V ABI(用于除 Windows 之外的所有设备)曾经位于 http://x86-64.org/documentation/abi.pdf,但现在该站点已从 Internet 上消失。

该文档是否有新的权威主页?

【问题讨论】:

0.99.6 草案是我所知道的最新版本。要绕过引用页面上的损坏链接,请尝试here。 在短暂的一年中断之后,www.x86-64.org 网站现在又回到了地球上。我想我们永远不会知道,但我很想知道那里的背景故事。 :) AMD 将预算削减了 100 美元的托管费用? agner.org/optimize/calling_conventions.pdf 也很想知道背景故事。对于遵循 32 位教程但现在对 x86-64 感到困惑的初学者来说,web.archive.org/web/20160609221003/http://www.x86-64.org/… 仍然是一个有用的 what's-new-in-x86-64 指南。真的很高兴 Wayback 机器的存在。 【参考方案1】:

System V x86-64 psABI 文档作为 LaTeX 源代码on GitLab 维护。同样,i386 psABI 是一个单独的GitLab repo。 (以前在github)。这些页面包含有关修订讨论位置的信息。

(TODO:查找根据最新版本构建的 PDF 的链接。此答案其余部分中的链接已经有一段时间没有更新了。)

另请参阅x86 tag wiki 以获取最新版本的直接链接。


截至目前,当前的 version for x86-64 is 1.0 (January 2018)。 有一个更新的 2018 年 12 月草稿版本(具有讽刺意味)从 PDF 本身的“草稿 1.0”版本号中删除了“草稿” . x32 ABI(长模式下的 32 位指针)是 x86-64 ABI 文档的一部分。请参阅第 10 章:ILP32 编程模型。

i386 is 1.1 的当前版本。 (请注意,某些操作系统使用旧版本的 i386 ABI,它不需要 16 字节堆栈对齐,只有 4 个。GCC 最终取决于 -mpreferred-stack-boundary=4 其 SSE 代码生成的 16 字节对齐(可能是无意的),最终,Linux 的 ABI 得到了更新,以将其作为官方要求。我尝试在 comment on GCC bug #40838 中进行摘要。这与一些调用其他函数的手写 asm 向后兼容。)

非正式地,sign-extending narrow args to 32-bit is required(适用于 i386 和 amd64),因为 clang 依赖于它。希望未来的 ABI 修订版能够记录这一点。


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


相关: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(如果您关心性能,这些是必不可少的阅读材料。)

Wikipedia 有一篇 x86 calling conventions 文章描述了各种约定,但大部分内容不够详细,无法将它们用于除简单整数参数之外的任何内容。 (例如,没有描述结构打包规则)。


相关:C++ ABI

GCC 和 Clang(在所有架构上)使用最初为 Itanium 开发的 C++ ABI。 https://itanium-cxx-abi.github.io/cxx-abi/。例如,这与需要在寄存器中传递 C++ 结构/类的哪些要求相关(例如,根据某些定义作为聚合)。

【讨论】:

X32 ABI 位于X32 System V Application Binary Interface。它是 Google 网站,而不是 GitHub;但它似乎由 H.J. Lu 维护。我想知道为什么 X32 不在同一个地方。 @jww:x32 记录在 x86-64 psABI PDF 的第 10 章中,至少在当前的 0.99.8 草案版本中。也许它曾经是一个单独的 PDF。 这是Intel version github 页面现在将人们指向gitlab.com/x86-psABIs/x86-64-ABI。不幸的是,它看起来不再有预构建的 PDF。【参考方案2】:

Linux 标准库

Linux Standard Base,可以被一些权威规范考虑,有一个名为7.2. "Function Calling Sequence"的部分指向2.1. "Normative References section",其中包含以下链接:

System V 应用程序二进制接口,4.1 版http://www.sco.com/developers/devspecs/gabi41.pdf System V 应用程序二进制接口 - 草案 - 2003 年 12 月 17 日http://www.sco.com/developers/gabi/2003-12-17/contents.html System V 应用程序二进制接口 AMD64 架构处理器补充,草案版本 0.95 http://refspecs.linux-foundation.org/elf/x86_64-abi-0.95.pdf

因此,除非您有充分的理由不这样做,否则我建议使用这些版本的规范作为规范版本。

【讨论】:

【参考方案3】:

GitLab 的 System V ABI当前版本 可以通过这些步骤轻松转换为漂亮的 PDF,假设Ubuntu系统。

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 的构建日期,而不是文档的实际最后修改日期。

【讨论】:

以上是关于x86-64 System V ABI 记录在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

System V ABI的红区是如何实现的

libstdc++ 静态链接和 System V ABI

linux用的是posix还是system v

linux查询静态库是arm平台还是x86平台

centos7查看系统版本,查看机器位数x86-64

centos7查看系统版本,查看机器位数x86-64