web-dev-qa-db-ja.com

GCCABIの互換性

私の知る限り、異なるバージョンのGCCのアプリケーションバイナリインターフェイス(ABI)を使用するライブラリをリンクすることはできません。 GCCのすべてのバージョンにABIの変更はありますか?たとえばGCC4.3.2を使用している場合、4.3.1で構築されたライブラリをリンクすることは可能ですか? GCCバージョンを組み合わせることができるすべての方法をリストしたある種のマトリックスはありますか?

26
Fredrik Ullner

公式ABIページABIcheck を指します。このツールは、あなたが望むことをするかもしれません。

12
ablaeul

Gcc-3.4.0以降、ABIは上位互換性があります。 I.E.古いリリースを使用して作成されたライブラリは、新しいリリースとリンクでき、機能するはずです(逆は機能しません)。明らかにバグがある可能性がありますが、ドキュメントに記載されているのは1つだけです: http://gcc.gnu.org/bugzilla /show_bug.cgi?id=33678

17
AProgrammer

うーん、そうだね。
どのgccが特定のバイナリをコンパイルしたかをどうやって見分けることができますか?これがgcc-4.7.2-1-mingw32.README.txtからの死亡通知です:

バイナリの非互換性に関する通知!

CおよびC++ ABIはGCC4.7.0で変更されました。つまり、一般に、このバージョンのコンパイラとGCC4.7.0より前のバージョンでコンパイルされたバイナリをリンクすることはできません。特に:

  • オプション-mms-bitfieldsはデフォルトで有効になっています。これは、ビットフィールドのレイアウトがMicrosoftコンパイラの規則に従っていることを意味します。

  • C++クラスメンバー関数は、__ thiscall呼び出し規約に従うようになりました。

  • コンパイラーは、呼び出し元が集計戻り値を指す暗黙の引数のスタックをポップすると想定するようになりました。これは、複雑な数学タイプのように、値によって構造体を返す関数に影響します。

2
user3603401