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

201
05 сентября 2021, 05:00

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

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

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

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

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

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

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

Answer 1

Да в *.dll попадут оба ключа. В этом отношении, линковка dll ни чем не отличается от exe. Проверить наличие переменной можно попросив линкер генерировать map файл.

Линкер может выкинуть (при подключении .lib файла), только единицу трансляции целиком (соответствующею одному .obj/.cpp, из тех, что попали в .lib), и только в случае, если нет ссылок ни на один символ из этой единицы трансляции. Но ссылка на публичный ключ используется в любом случае...

Самый надежный способ - написать две статические либы: с приватным и с публичным ключами по отдельности, тем более, что они должны обеспечивать разную функциональность: передача и прием сообщений.

Answer 2

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

READ ALSO
C++ rvalue присваивание объекта

C++ rvalue присваивание объекта

Работаю с std::list Есть класс TTimerData (с методами) который надо поместить в лист

231
jQuery получение параметра по id в ASP.NET MVC

jQuery получение параметра по id в ASP.NET MVC

Хочу получить текстовое содержимое по id, например получить "6000118":

122
Заполнение двумерного массива вихрем

Заполнение двумерного массива вихрем

Имеется массив n*n, необходимо его заполнить вихрем, те

239