【问题标题】:Where is the x86-64 System V ABI documented?x86-64 System V ABI 记录在哪里?
【发布时间】: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 美元的托管费用?
  • 也很想知道背景故事。对于遵循 32 位教程但现在对 x86-64 感到困惑的初学者来说,web.archive.org/web/20160609221003/http://www.x86-64.org/… 仍然是一个有用的 what's-new-in-x86-64 指南。真的很高兴 Wayback 机器的存在。

标签: linux assembly x86-64 calling-convention abi


【解决方案1】:

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

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

另请参阅 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。
  • github 页面现在将人们指向gitlab.com/x86-psABIs/x86-64-ABI。不幸的是,它看起来不再有预构建的 PDF。
【解决方案2】:

Linux 标准库

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

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

【讨论】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 2019-04-26
      • 2021-01-01
      • 1970-01-01
      • 2021-10-14
      相关资源
      最近更新 更多