Статическая библиотека загружается дважды

У меня есть общий объект A.so, который статически ссылается на libssl.a и другой общий объект B.so, который также статически связывает libssl.a.

A.so & B.so имеет символы из libssl.a в GLOBAL scope. Я проверил это с помощью readelf -s A.so

У меня есть исполняемый файл a.out, который загружает A.so и B.so. Когда a.out завершено, я получаю двойную свободную ошибку в одном из символов libssl.a в A.so.

Несмотря на то, что libssl.a статически связан с каждым общим объектом, поскольку они отображаются глобально, возможно, что один и тот же символ является общим, а не собирает его локальную копию.

Какое обходное решение это? Как сделать здесь символы здесь?

Пожалуйста помоги

Это действительно ожидается. Один экземпляр libssl.a (вероятно, подмножество) другого, и результаты не очень libssl.a . Вы можете использовать скрипт версии ( --version-script для ld, с -Wl, для cc), чтобы управлять тем, что экспортируется из A.so и B.so Если что-то не экспортируется, оно также не может быть вставлено.

Кроме того, вы можете скомпилировать libssl.a с флагами видимости, такими как -fvisibility=hidden . Эти флаги влияют только на динамический компоновщик, а не на статическую связь. Скорее всего, вам нужно было скомпилировать его самостоятельно, потому что отправленные файлы .a обычно содержат код, зависящий от позиции, предназначенный для связи с исполняемыми файлами. Только некоторые платформы, такие как 32-разрядная x86, позволяют вам уйти с привязкой такого кода к общим объектам и только за счет перераспределения текста.

Должно также работать RTLD_LOCAL с RTLD_LOCAL как это предлагается в комментарии, но для этой цели кажется, что для использования dlopen кажется хакерским.

Другой вариант – использовать тот же общий libssl.so в обеих библиотеках.