Загрузка двух экземпляров разделяемой библиотеки
Для теста я хотел бы загрузить два экземпляра разделяемой библиотеки из приложения. Код в библиотеке предоставляет API, но он не позволяет мне инициализировать два (или более) экземпляра библиотеки, потому что некоторые из функций полагаются на статические переменные..
В настоящее время я пишу unit-тесты для этой библиотеки, и мне бы хотелось иметь два экземпляра, потому что это упростило бы мои тесты.
Библиотека не связана с программой. Вместо этого я загружаю его напрямую с помощью LoadLibrary/GetProcAddress (или dlopen/dlsym на linux). Чтобы отличить две библиотеки, я мог просто использовать разные имена для указателей функций, которые я загружаю...
Вот вопросы:
-
Можно ли загрузить такую библиотеку дважды? Например. Все загруженные экземпляры библиотеки должны получать свой собственный сегмент данных и не влиять друг на друга.
-
Если да: это переносимый для Windows и Linux?
Ответы
Ответ 1
Вы можете загрузить библиотеку дважды, теоретически, если она скомпилирована как независимый от позиции код (-fPIC
).
В некоторых Unices вы можете затем dlopen
использовать библиотеку дважды, если у вашего загрузчика есть флаг RTLD_PRIVATE
или с помощью двух "разных" копий библиотеки с одинаковыми символами (поместите ее на два разных пути, иначе он просто вернет первый дескриптор файла) и откроет их каждый с RTLD_LOCAL
.
Я ничего не знаю о библиотеках Windows. Возможно, это даже не возможно.
Ответ 2
По крайней мере в Windows вы можете просто переименовать библиотеку и загрузить оба из них.