GCC ABI совместимость - PullRequest
25 голосов
/ 10 мая 2010

Насколько я понял, невозможно связать библиотеки, которые используют разные версии двоичного интерфейса приложений GCC (ABI). Есть ли изменения ABI в каждой версии GCC? Можно ли связать библиотеку, созданную с 4.3.1, если я использую, скажем, GCC 4.3.2? Есть ли какая-нибудь матрица, в которой перечислены все способы, которыми я могу комбинировать версии GCC?

Ответы [ 3 ]

17 голосов
/ 10 мая 2010

Начиная с gcc-3.4.0, ABI совместим с прямой совместимостью. И.Е. библиотека, созданная с использованием более старого выпуска, может быть связана с более новым, и она должна работать (обратное не работает). Очевидно, что могут быть ошибки, но в документации упоминается только один : http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33678

11 голосов
/ 10 мая 2010

Официальная страница ABI указывает на ABIcheck . Этот инструмент может делать то, что вы хотите.

2 голосов
/ 07 мая 2014

тьфу, yikes.
Как вы можете сказать, какой 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.

  • Компилятор теперь предполагает, что вызывающая сторона извлекает стек для неявные аргументы, указывающие на совокупное возвращаемое значение. Это влияет функции, возвращающие структуры по значению, например, сложный математический тип.

...