Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Как хранятся глобальные const данные в библиотеках C++

#cpp #dll #lib #namespace #const


Есть статическая библиотека (.lib/.a).
В этой библиотеке находится файл с namespace, в котором две const переменные с публичным
и приватным ключом:

namespace dsa
{
   const std::vector private_key = {...}
   const std::vector public_key = {...}
}


Публичный ключ используется в динамической библиотеке (.dll/.so), путем подключения
исходной статической библиотеки.

Приватный ключ используется в исполняемом файле, путем подключения исходной статической
библиотеки.

Поскольку статическая библиотека является слепком .obj файлов единиц трансляции,
то оба ключа будут в ней, это понятно.

А вот будет ли в публичную динамическую библиотеку (.dll/.so) попадать информация
о приватном ключе, если в ней не вызываются функции, использующие его?

Как вообще организовано хранение подобных данных (глобальные const НЕ POD данные)
в windows/linux файлах динамических библиотек?
    


Ответы

Ответ 1



Да в *.dll попадут оба ключа. В этом отношении, линковка dll ни чем не отличается от exe. Проверить наличие переменной можно попросив линкер генерировать map файл. Линкер может выкинуть (при подключении .lib файла), только единицу трансляции целиком (соответствующею одному .obj/.cpp, из тех, что попали в .lib), и только в случае, если нет ссылок ни на один символ из этой единицы трансляции. Но ссылка на публичный ключ используется в любом случае... Самый надежный способ - написать две статические либы: с приватным и с публичным ключами по отдельности, тем более, что они должны обеспечивать разную функциональность: передача и прием сообщений.

Ответ 2



Исходя из ответа @Chorkov провел несколько тестов с использованием /MAP и результаты огорчили. Решил хранить приватный ключ в отдельном файле, исключив его таким образом из кода вообще.

Комментариев нет:

Отправить комментарий