加载共享库的两个实例

Nil*_*nck 13 c linux windows dll

对于测试,我想从应用程序加载两个共享库实例.库中的代码提供了API,但它不允许我初始化库的两个(或更多)实例,因为某些函数依赖于静态变量.

我正在为这个lib编写单元测试,我想有两个实例,因为这会简化我的测试.

该库未链接到该程序.相反,我使用LoadLibrary/GetProcAddress(或Linux上的dlopen/dlsym)直接加载它.为了区分这两个库,我可以简单地为我正在加载的函数指针使用不同的名称...

以下是问题:

  • 是否可以加载这样的库两次?例如,库的所有已加载实例应该获得自己的数据段,并且不会相互影响.

  • 如果是这样:这对于Windows和Linux来说是否可移植?

Bor*_*lid 9

理论上,如果它被编译为与位置无关的代码(-fPIC),则可以加载两次库.

在某些Unices上,dlopen如果你的加载器有一个RTLD_PRIVATE标志,你可以使用两次库,或者使用相同符号的库的两个"不同"副本(将它放在两个不同的路径上,否则它将只返回第一个文件句柄) ,并打开它们RTLD_LOCAL.

我对Windows共享库一无所知.它甚至可能是不可能的.