一尘不染

加载共享库的两个实例

linux

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

我目前正在为此lib编写单元测试,并且我想拥有两个实例,因为这将大大简化我的测试。

该库未链接到该程序。相反,我直接使用LoadLibrary / GetProcAddress(或linux上的dlopen /
dlsym)加载它。为了区分这两个库,我可以为要加载的功能指针使用不同的名称…

这里是问题:

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

  • 如果是这样:Windows和Linux是否可移植?


阅读 337

收藏
2020-06-03

共1个答案

一尘不染

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

在某些Unices上,dlopen如果加载程序有一个RTLD_PRIVATE标志,或者通过具有相同符号的两个“不同”库副本(将其放在两个不同的路径上,则它可以返回第一个文件句柄),然后可以对该库执行两次操作,并使用打开它们RTLD_LOCAL

我对Windows共享库一无所知。甚至不可能。

2020-06-03