GCC ABI兼容性

时间:2010-05-10 10:36:25

标签: c++ gcc compatibility abi

据我所知,不可能链接使用不同版本的GCC应用程序二进制接口(ABI)的库。是否对每个版本的GCC都进行了ABI更改?如果我使用GCC 4.3.2,是否可以链接使用4.3.1构建的库?是否有某种矩阵列出了我可以组合GCC版本的所有方法?

3 个答案:

答案 0 :(得分:17)

从gcc-3.4.0开始,ABI是向前兼容的。 I.E.使用较旧版本创建的库可以与较新版本链接,它应该可以工作(反之则不然)。显然,可能存在错误,但文档中只提到一个http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33678

答案 1 :(得分:11)

The official ABI page指向ABIcheck。这个工具可以做你想要的。

答案 2 :(得分:2)

哎呀,哎呀 你怎么知道哪个gcc编译了给定的二进制文件?这里是 来自gcc-4.7.2-1-mingw32的死亡通知.README.txt:

二元不兼容通知!

C和C ++ ABI在GCC 4.7.0中发生了变化,这意味着一般情况下你不能这样做 链接在一起使用此版本的编译器编译的二进制文件 与GCC 4.7.0之前的版本。特别是:

  • 默认情况下启用选项-mms-bitfields,这意味着位域布局 遵循Microsoft编译器的惯例。

  • C ++类成员函数现在遵循__thiscall调用约定。

  • 编译器现在假定调用者弹出堆栈 指向聚合返回值的隐式参数。这影响了 函数按值返回结构,如复杂的数学类型。