Как заставить cxx11 ABI на Red Hat? - PullRequest
1 голос
/ 31 октября 2019

Я собираю небольшую библиотеку .so в Ubuntu 16.04 и Red Hat 7, используя gcc 7.3. Когда я проверяю имена символов экспорта с помощью команды nm, я обнаруживаю, что библиотека, скомпилированная в Ubuntu, использует ABI cxx11, а библиотека, скомпилированная в RedHat, - нет.

Например, символ экспорта для функции, скомпилированной вUbuntu выглядит так.

_Z12customLoad3DPKN8nlohmann10basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmdSaNS_14adl_serializerEEEPP11IVolumeDataPSA_

Но один и тот же символ экспорта при компиляции в RedHat выглядит следующим образом.

_Z12customLoad3DPKN8nlohmann10basic_jsonISt3mapSt6vectorSsblmdSaNS_14adl_serializerEEEPP11IVolumeDataPS4_

Обе библиотеки используют один и тот же make-файл. Код использует #define _GLIBCXX_USECXX11_ABI 1 и параметр командной строки -std = c ++ 11. Я также попытался использовать опцию -fabi-version с разными значениями, но все безрезультатно. Я не могу решить это с помощью метода #ifdef __cplusplus extern "C", потому что функции используют параметры класса шаблона.

Как заставить gcc на RedHat использовать ABX cxx11? Я не могу использовать двойное связывание ABI, потому что библиотека .so используется как плагин для приложения, которое во время выполнения связывает с функциями в библиотеке, используя жестко закодированный список искаженных имен. Плагин не будет работать в Red Hat, потому что искаженные имена не соответствуют ожиданиям программы. Как мне это исправить?

Спасибо!

1 Ответ

0 голосов
/ 31 октября 2019

ABI libstdc++ C ++ 11 не поддерживается в Red Hat Enterprise Linux 7. У вас есть два варианта:

  • Обновление до Red Hat Enterprise Linux 8. Его системный компиляторпо умолчанию используется более новый ABI.

  • Перестройте приложение в Red Hat Enterprise Linux 7, используя Developer Toolset . Модель гибридной связи гарантирует, что приложение будет работать в Red Hat Enterprise Linux 7. Доступен только старый ABI, но это, как правило, не имеет значения из-за перестроения, поскольку результат является внутренне согласованным.

...