C ++ ABI标准符合w /任意名称修改

时间:2013-06-14 21:57:53

标签: c++ abi

好的,问题标题是一种钩子。我已经知道没有C ++标准ABI。也就是说,我并没有欺骗你渴望过度的收集者。我想知道C ++ ABI是否有任何限制。例如,至少在ABI名称中,某个类的名称会被错误地某处,这似乎很常见。

更明确的问题

假设我在所有字符串上都有一个无冲突的哈希函数。然后让我们说GCC在其名称中添加了一个步骤:将当前受损名称的哈希附加到下划线。这会破坏几乎所有在阳光下的东西,但GCC仍然会像以前一样符合C ++标准吗?

修改

好吧,显然'明确的问题'位是一个选择不当的小节名称。我真的想了解更多关于人们遵循的常见ABI标准的信息。这是因为我使用Mingw32编译的二进制文件的存在已成功地与我用MSVC编译的二进制文件链接。

3 个答案:

答案 0 :(得分:5)

它仍然符合ISO C ++标准,它甚至没有提到规范文本中的名称修改,更不用说限制它如何完成,但不符合GCC使用的跨供应商ABI standard对于大多数平台而言。

答案 1 :(得分:4)

标准在这个问题上非常沉默,故意:所有与ABI和名称修改有关的都是特定于实现的。关于这个问题的信息最接近的是,我相信:

  

7.5 / 1 [dcl.link]

     

所有函数类型,具有外部链接的函数名称和变量   具有外部链接的名称具有语言链接。 [注意:部分   与具有语言链接的实体关联的属性是   具体到每个实现,这里不再描述。对于   例如,特定语言链接可以与a相关联   表示对象和函数名称的特殊形式   外部链接,或特定的调用约定等 - 结束   注意]

因此,只要被破坏的名称在底层操作系统上有效,每个实现都可以自由地执行它想要的名称修改

答案 2 :(得分:0)

是的,它当然仍然符合标准。然而,正如标准兼容一样令人敬畏,它肯定不是全部而且最终都是。

这样的改变实际上会破坏用C ++编写并使用所述GCC版本编译的每个库或应用程序的向后兼容性。向后兼容性对于GCC开发人员来说非常重要,他们花了很长时间在邮件列表上(只是看看)讨论即使是这样的破坏,即使是非常小的ABI变化的相对好处。他们经常会花费相当长的时间来提供可以保持向后兼容性的解决方法。

有些东西告诉我,如果他们改变了这个政策,大多数发行版都会拒绝升级。可能会让他们中的一大群人甚至动起来......

至少我们可以放心,他们会添加另一个-f选项,以关闭新的“功能”。