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

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


person Fredrik Ullner    schedule 10.05.2010    source источник
comment
С GCC 5.1 все становится еще лучше... Также см. Проблемы связывания из-за символов с abi::cxx11? и Дело GCC-5.1 и Два C++ ABI.   -  person jww    schedule 22.03.2016


Ответы (3)


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

person ablaeul    schedule 10.05.2010
comment
Хм, на официальной странице ABI есть пример кода (Multiple ABI Testing), где используются несколько версий... Как это возможно, если они потом говорят, что вы должны перекомпилировать все с той же версией? - person Fredrik Ullner; 10.05.2010
comment
В этом примере показано, как использовать компоновщик, чтобы иметь возможность связывать несколько библиотек. Но они не будут интероперабельны: например, вы не сможете передать вектор из первой библиотеки в другую. - person AProgrammer; 10.05.2010
comment
То есть это относительно бессмысленно, поскольку это, очевидно, то, что вы хотели бы сделать. - person Fredrik Ullner; 10.05.2010

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

person AProgrammer    schedule 10.05.2010
comment
Не могли бы вы пояснить второе предложение? Если моя общая dll является более старой версией, но исполняемый файл новее, это нормально, но если моя общая dll новее, а исполняемый файл старше, это не так? - person Cookie; 07.11.2012
comment
@Куки, верно. И обратите внимание, что для компилятора стандартная библиотека имеет свои собственные правила, но они также стараются быть совместимыми с предыдущими версиями. - person AProgrammer; 07.11.2012
comment
Похоже, что он больше не совместим с GCC 5.1. См. также Проблемы связывания из-за символов с abi::cxx11? и Пример GCC-5.1 и двух C++ ABI. - person jww; 22.03.2016
comment
У меня была та же проблема с GCC 5.2: я не могу связать две библиотеки: одна из пакета Ubuntu Wily, другая из пакета Intel Pin (который был скомпилирован со старой версией gcc). - person Ta Thanh Dinh; 24.03.2016

Тьфу, да.
Как узнать, какой 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.

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

person user3603401    schedule 07.05.2014
comment
Просто для ясности: я думаю, что это относится только к людям, использующим GCC в Windows. В Linux нет нарушения совместимости, кроме как для пользователей C++11 из-за ошибки в 4.7.0 и 4.7.1. Даже это исправлено в 4.7.2, поэтому просто избегайте двух выпусков с плохими точками, и все в порядке. - person John Zwinck; 08.10.2014