Насколько я понял, невозможно связать библиотеки, использующие разные версии бинарного интерфейса приложений (ABI) GCC. Есть ли изменения ABI для каждой версии GCC? Можно ли связать библиотеку, созданную с 4.3.1, если я использую, скажем, GCC 4.3.2? Есть ли какая-то матрица, в которой перечислены все способы, которыми я могу комбинировать версии GCC?
Совместимость с GCC ABI
Ответы (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.README.txt:
Уведомление о двоичной несовместимости!
ABI C и C++ изменился в GCC 4.7.0, что означает, что в целом вы не можете связать вместе двоичные файлы, скомпилированные с помощью этой версии компилятора и с версиями до GCC 4.7.0. Особенно:
Параметр -mms-bitfields включен по умолчанию, что означает, что макет битового поля соответствует соглашению компилятора Microsoft.
Функции-члены класса C++ теперь следуют соглашению о вызовах __thiscall.
Теперь компилятор предполагает, что вызывающая программа извлекает из стека неявные аргументы, указывающие на совокупное возвращаемое значение. Это влияет на функции, возвращающие структуры по значению, например сложные математические типы.