2010-08-08 2 views
11

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

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

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

Вот вопросы:

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

  • Если это так: Является ли это переносной для окон и Linux?

ответ

8

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

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

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

+1

Все скомпилировано с помощью -fPIC, конечно .. Не знал о RTLD_PRIVATE. После мужской сессии он выглядит именно так, что я хочу - для Linux наконец. Я могу открыть отдельный вопрос для окон. –

3

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

+0

Windows будет загружать несколько экземпляров одной и той же DLL, если вы используете полные пути; то есть «C: \ path1 \ test.dll», «C: \ path2 \ test.dll» и т. д. Если вы не хотите создавать отдельные каталоги, то переименование является единственным другим подходом. – Luke

Смежные вопросы