如何在同一过程中从不同路径两次加载相同的库?

问题描述

我正在编写一个新程序,该程序使用OpenSSL加密数据。我希望我的程序符合FIPS。为了实施FIPS模式,我使用API​​ FIPS_mode_set 进行设置。 我还需要将加密的数据传输到第三方设备。

设备供应商还提供了与设备进行通信的库。该库还依赖于OpenSSL库。

我的程序直接依赖的OpenSSL库位于与第三方库依赖的路径不同的路径上。

库的加载顺序与我的程序一起加载了直接相关的OpenSSL库。在运行时,我正在加载第三方库以与设备通信。副作用是,它应该再次尝试从其他路径加载OpenSSL库。

在Windows中,来自不同路径的两个库均在该过程中加载,并且独立工作。因此该程序在Windows上可以正常运行。

但是,对于Linux,仅加载一个OpenSSL库。我将其设置为FIPS模式。当第三方库尝试调用非FIPS调用的API sha1_init() 时,程序崩溃。

现在,我想知道是否有一种方法可以将Linux中的两个OpenSSL库分别加载到Windows中吗?

如果否,那么您会提出一种解决这种情况的方法吗?

解决方法

我想知道是否有一种方法可以将Linux中的两个OpenSSL库分别加载到Windows中?

UNIX(和Linux)使用非常不同的共享库模型。在Windows上,每个DLL都在自己的世界中,是一个独立的单元,调用自己的malloc等。

在UNIX上,所有内容都在单个共享名称空间中,符号也可以共享,等等。

甚至,即使您设法从不同的路径加载两个单独的libopenssl.so,它们的符号仍将位于单个命名空间中,第一个库将加载将“获胜”(无论调用是来自您的程序还是来自供应商库,都将使用符号)。这是设计

现在,您可以使用dlmopen(GLIBC扩展名)来拥有完全独立的链接器“域”。那实际上将为您提供Windows DLL模型。

但是,使用dlmopen有各种复杂的要求(库必须正确指定所有依赖项),并带来其他复杂性(例如,您现在将拥有两个单独的{{ 1}}在您的处理空间中,并且您不能将它们混为一谈。

更好的方法可能是使用两个单独的过程-一个包含大部分代码并且符合FIPS的过程,另一个将供应商库链接到主程序向其发送请求的服务器。显然,由于此设置需要IPC,因此会产生一些开销,但同时也会使您与供应商库中的错误隔离。