Std::regex и двойной ABIC++

Программы на C++. Форум разработчиков
Anonymous
Std::regex и двойной ABI

Сообщение Anonymous »

Сегодня я обнаружил интересный случай, когда двойной ABI libstdc++ влияет на совместимость библиотек.
Коротко говоря, у меня есть две библиотеки, которые внутри используют std::regex. Один построен с использованием CXX11 ABI, а другой — нет. Когда эти две библиотеки связаны вместе в один исполняемый файл, происходит сбой при запуске (до ввода основного).
Библиотеки не связаны между собой и не предоставляют интерфейсы, в которых упоминаются какие-либо std. :: типы. Я думал, что такие библиотеки должны быть защищены от двойных проблем ABI. Судя по всему, нет!
Проблему можно легко воспроизвести следующим образом:

Код: Выделить всё

// file.cc
#include 
static std::regex foo("(a|b)");

// main.cc
int main() {}

// build.sh
g++ -o new.o -c file.cc
g++ -o old.o -c file.cc -D_GLIBCXX_USE_CXX11_ABI=0
g++ -o main main.cc new.o old.o
./main
И вывод:

Код: Выделить всё

terminate called after throwing an instance of 'std::bad_alloc'
what():  std::bad_alloc
Aborted (core dumped)
Проблема сохраняется, что бы я ни делал. file.cc можно превратить в два отдельных исходных файла, скомпилированных в отдельные общие библиотеки, два объекта std::regex могут иметь разные имена, их можно сделать глобальными, статическими или автоматическими (один будет тогда необходимо вызвать соответствующие функции из main). Ничего из этого не помогает.
Очевидно (это то, что вытекает из моего короткого расследования), компилятор регулярных выражений libstdc++ имеет какие-то внутренние статические данные, в которых хранятся std::string, и когда два ABI-несовместимых фрагмента кода пытаются использовать эти данные, возникают противоречивые представления о расположении объектов std::string.
Поэтому мои вопросы:< /p>
  • Есть ли обходной путь для этой проблемы?
  • Следует ли это считать ошибкой в ​​libstdc++?
Проблема воспроизводится в нескольких версиях g++/libstdc++ (я пробовал несколько версий от 5.4 до 7.1). Этого не происходит с libc++.

Подробнее здесь: https://stackoverflow.com/questions/513 ... d-dual-abi

Вернуться в «C++»