Загрузка двух экземпляров общей библиотеки - PullRequest
13 голосов
/ 08 августа 2010

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

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

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

Вот вопросы:

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

  • Если так: это портативный компьютер для Windows и Linux?

Ответы [ 2 ]

9 голосов
/ 08 августа 2010

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

В некоторых Unix вы можете затем dlopen библиотека дважды, если ваш загрузчик имеетфлаг RTLD_PRIVATE или наличие двух «разных» копий библиотеки с одинаковыми символами (поместите его в два разных пути, в противном случае он просто вернет первый дескриптор файла), и открыв их каждый с RTLD_LOCAL.

Я ничего не знаю о разделяемых библиотеках Windows.Это может быть даже невозможно.

3 голосов
/ 08 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...