Смешивание C++ ABI для сборки с устаревшими библиотеками

Ситуация такая, у меня есть кодовая база C++, которая использует последний GCC (4.3.3), но мне нужно поставить ссылку на старую библиотеку, которая была собрана с помощью GCC 3.2.3. Более новой версии библиотеки не существует, я не могу обойтись без нее, и она имеет закрытый исходный код, поэтому ее нельзя переделать.

Это кажется проблемой, поскольку существует несовместимость ABI между GCC 4.3.3 и 3.2.3, поэтому я пытаюсь понять, какие есть варианты решения этой проблемы.

Несколько дополнительных деталей:

  • Я могу пересобрать все в моей кодовой базе с -fabi-version=1, чтобы получить правильную версию ABI, но я завишу от некоторых новых возможностей libstdc++ версии 6.
  • Все зависимости библиотек C++ за пределами кодовой базы имеют открытый исходный код, поэтому я могу перестраивать их по мере необходимости, за исключением этой библиотеки.
  • Много зависимостей библиотек C, которые нельзя пересобрать или будет трудно пересобрать.
  • Старая библиотека, похоже, зависит от некоторых функций libstdc++ версии 5

Я уже пробовал:

  • Пересобрать весь C++ код и зависимые библиотеки с -fabi-version=1 и линковать с libstdc++ версии 6. Это не удается с горсткой ошибок неопределенных символов для символов стандартной библиотеки C++.
  • То же, что и выше, но дополнительно подключить разделяемую библиотеку libstdc++ версии 5. Это решает проблемы с компоновщиком, но приводит к смешиванию двух версий во время выполнения внутри унаследованной библиотеки, что вызывает крах.

Я прочитал эту страницу: http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html, которая, похоже, указывает на возможность смешивания версий C++ ABI в приложении для удовлетворения различных зависимостей между библиотеками. Однако, похоже, что это не очень хорошо работает в данном случае, если я ничего не упустил.

Есть идеи?

5
задан Paul D. 6 February 2012 в 15:26
поделиться