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

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

3 ответов


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


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


Тьфу, блин.
Как вы можете сказать, какой gcc скомпилировал данный двоичный файл? Вот уведомление о смерти от gcc-4.7.2-1-mingw32.Читай.txt:

уведомление о бинарной несовместимости!

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

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

  • функции-члены класса C++ теперь следуют соглашению о вызовах __thiscall.

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