Загрузка двух экземпляров разделяемой библиотеки

Для теста я хотел бы загрузить два экземпляра общей библиотеки из приложения. Код в библиотеке предоставляет API, но он не позволяет мне инициализировать два (или более) экземпляра библиотеки, потому что некоторые функции полагаются на статические переменные.

В настоящее время я пишу модульные тесты для этой библиотеки , и я хотел бы иметь два экземпляра, потому что это сильно упростило бы мои тесты.

Библиотека не подключается к программе. Вместо этого я загружаю его напрямую, используя LoadLibrary / GetProcAddress (или dlopen / dlsym в Linux). Чтобы различать две библиотеки, я мог бы просто использовать разные имена для указателей функций, которые я загружаю ...

Вот вопросы:

  • Можно ли загрузить такую ​​библиотеку дважды? Например. Все загруженные экземпляры библиотеки должны иметь свой сегмент данных и не влиять друг на друга.

  • Если да: это переносимо для Windows и Linux?

13
задан Borealid 8 August 2010 в 08:43
поделиться

2 ответа

Теоретически, вы можете загрузить библиотеку дважды, если она скомпилирована как позиционно-независимый код (-fPIC).

На некоторых Unices вы можете dlopen библиотеку дважды, если ваш загрузчик имеет флаг RTLD_PRIVATE, или имея две "разные" копии библиотеки с одинаковыми символами (поместите их в два разных пути, иначе он просто вернет хэндл первого файла), и открыв их каждую с помощью RTLD_LOCAL.

Я ничего не знаю об общих библиотеках Windows. Возможно, это даже невозможно.

9
ответ дан 2 December 2019 в 00:57
поделиться

По крайней мере, в Windows вы можете просто переименовать библиотеку и загрузить их обе.

3
ответ дан 2 December 2019 в 00:57
поделиться
Другие вопросы по тегам:

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