Как избавиться от double free or corruption при выгрузке библиотеки?
Исходные данные
Имеется статическая библиотека назовем ее libInternal.a
Есть динамическая библиотека которая линкует libInternal.a, назовем ее libExternal.so.
Есть также исполняемый файл который динамически подгружает libExternal.so, также этот исполняемый файл линкует libInternal.a
Проблемма
Как работает исполняемый файл: загружает libExternal.so, тут же выгружает, не выполняя кода из нее, и при выходе из main() падает с сообщением double free or corruption
Если не линковать к исполняемому файлу статическую библиотеку то программа завершается корректно.
В статической библиотеке есть глобальные переменные типа std::string, если убрать их использование в статической библиотеке то программа также завершается успешно.
Примечание: я пробовал повторить ситуацию на маленьком проекте но почему-то там такой проблемы не возникло. Из за чего может быть такая проблема? Я подозреваю что это из-за того что в памяти находятся две копии данных, но адреса то у них разные.
Для сборки проекта используется cmake-3.5.1 и g++-5.4.0
Проблема в том что у меня не получилось создать минимальный проект моделирующий ошибку. Может быть на эту ситуацию влияет еще что-то о чем я не знаю(флаги компиляции, расположение файлов и т.д. )
Прогнал через valgrind и он почему то ругается на строку где определена эта глобальная переменная:
17 bytes in 1 blocks are definitely lost in record 1 of 68 B __static_initialization_and_destruction_0(int, int)
Я подозреваю что это из-за того что в памяти находятся две копии данных, но адреса то у них разные.
Не в этом. Статическая переменная внутри образа приложения размечается на пространстве его образа, статическая переменная внутри динамической библиотеки размечается внутри ее образа. Это две разные переменные с точки зрения памяти.
Проблема в другом.
Тебе не удалось собрать минимальный воспроизводящий пример именно потому что проблема не в этих std::string-ах, а в том, как, может быть, с ними работают элементы статической библиотеки.
Тут полный полет фантазии, все ответы есть только у тебя, т.к. только у тебя имеется исходный код.
Выкиньте глобальные переменные. Глобальные переменные, созданные в библиотеках, несут еще большее количество проблем, чем обычные глобальные переменные.
Всякая глобальная сущность - удар по репутации архитектора.