@Riki-tiki-tavi

Как избавиться от 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
  • Вопрос задан
  • 1138 просмотров
Пригласить эксперта
Ответы на вопрос 1
gbg
@gbg Куратор тега Linux
Любые ответы на любые вопросы
Выкиньте глобальные переменные. Глобальные переменные, созданные в библиотеках, несут еще большее количество проблем, чем обычные глобальные переменные.

Всякая глобальная сущность - удар по репутации архитектора.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы