Совместимость GCC ABI

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

Ответ 2

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

Ответ 3

Ух, yikes.
Как вы можете определить, какой gcc составил данный двоичный файл? Здесь уведомление о смерти от gcc-4.7.2-1-mingw32.README.txt:

Уведомление о двоичной несовместимости!

C и С++ ABI изменены в GCC 4.7.0, что означает, что вы вообще не можете свяжите вместе двоичные файлы, скомпилированные с этой версией компилятора и с версиями до GCC 4.7.0. В частности:

  • Опция -mms-bitfields включена по умолчанию, что означает макет битового поля следует за соглашением компилятора Microsoft.

  • Функции класса С++ теперь следуют за соглашением __thiscall.

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