【问题标题】:Which ABI does compiler follows to compiles C code and how could I know from it (GCC for example)?编译器遵循哪个 ABI 来编译 C 代码,我怎么能从中知道(例如 GCC)?
【发布时间】:2019-09-11 01:55:45
【问题描述】:

1) 编译器遵循哪个 ABI 来编译 C 代码,我怎么知道它(例如 GCC)?

2)我从网上了解到有很多ABI。我想知道在 x86-64 类 Unix 平台上,所有系统和编译器都遵循相同的 ABI 吗?如果他们这样做,他们遵循哪个 ABI?是 System V ABI(https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-1.0.pdf)?

我使用gcc -v --help 来查看帮助手册。但它们似乎都没有显示 ABI 信息。

【问题讨论】:

  • 如果针对 Linux,该平台的所有编译器都符合您在问题中引用的 x86-64 System V ABI
  • 但是像 GNU ABI 这样的其他 ABI 怎么样?它们有什么区别?
  • x86-64 System V ABI 是 Linux 上调用约定的 THE ABI。 ABI 涵盖了 Linux 系统调用的软件调用约定和系统调用调用约定。其他一切都建立在此之上。
  • 您还会发现您链接到的文档讨论了所使用的 C++ ABI,并且它们指向外部参考。还指定了 Fortran 的调用约定。
  • 非常感谢。现在我明白了他们之间的关系。

标签: unix gcc x86-64 abi


【解决方案1】:

对于 C,编译器遵循运行它的处理器和操作系统的 ABI。您找到的 ABI 文档是我希望在 linux 和 Solaris 上看到的。

对于 C++,据我所知,大多数编译器都使用 GNU ABI。

【讨论】:

  • 那么不同的语言有自己的ABI?
  • 据我所知只有两个:C 和 C++。几乎所有其他语言都是建立在其中一种之上的,所以它就是这样简化的。
  • @Kevin_xie 它们大部分都是一样的,但是出于某种疯狂的原因,即使在 x86-64 上,Go 也使用自己的堆栈参数调用约定。在 32 位 x86 Windows 上,有多种广泛使用的调用约定,并且大多数编译器允许您基于每个函数指定函数属性。无论如何,C++ 使用与 C 相同的调用约定,其中包含 C++ 事物如何映射到 C 的规则。但是有一些 C++ 特定的事物,例如具有虚拟成员函数的类型的结构布局:C++ ABI 使用诸如 vtable 布局之类的东西扩展了 C ABI以及用于异常处理的堆栈展开规则。
  • AFAIK Go 的独特之处在于 not 建立在其运行平台的标准调用约定之上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 2014-01-18
  • 2017-11-09
  • 1970-01-01
相关资源
最近更新 更多