我在查看C ++的GCC手册,发现以下引言:
版本0指最符合C ++ ABI的版本 规格。因此,使用版本0获得的ABI将发生变化 在G ++的不同版本中,已修复了ABI错误。 (source)
可以看出,以上段落引用了某种看似标准的C ++ ABI。据我了解,但是不存在这样的ABI。这是什么意思?一个好的答案将给出尽可能详尽的解释。将“ C ++ ABI规范”放入我首选的搜索引擎中并没有任何用处。
答案 0 :(得分:7)
从WG21提案N4028 Defining a Portable C++ ABI 中我们可以看到gcc指的是Common Vendor ABI (Itanium C++ ABI):
现有实践
现有做法的示例包括:
-通用供应商ABI(Itanium C ++ ABI)是朝着这个方向迈出的一步, 在某些平台上为该语言指定一个ABI。 受支持 今天由GCC和EDG之类的编译器。它没有指定ABI 对于标准库,因此这是必要的,但不足以做到这一点, 例如,在稳定的API边界上使用std :: string
-同样,Microsoft VC ++长期以来一直具有稳定的语言,尽管没有文档说明,但该语言仍为ABI。它没有用于标准库的稳定的ABI,而是有意破坏每个主要发行版的ABI兼容性,例如,以便允许持续改进。 实施并快速实施一个包含ABI重大更改的新标准库。
...
gcc在其ABI Policy and Guidelines中也对此进行了介绍:
...此外,编译成目标文件的C ++源代码由编译器转换:它以特定的对齐方式排列对象,并以特定的布局排列,根据定义良好的算法处理名称,并为支持提供特定的排列这些详细信息定义为编译器“应用程序二进制接口”或ABI。从GCC版本3开始, GNU C ++编译器使用行业标准的C ++ ABI,即Itanium C ++ ABI 。 ...
答案 1 :(得分:2)
GCC默认使用Itanium ABI:http://itanium-cxx-abi.github.io/cxx-abi/