Openssl 如何在同一进程中从不同路径两次加载到同一库?

Openssl 如何在同一进程中从不同路径两次加载到同一库?,openssl,shared-libraries,loader,dynamic-linking,fips,Openssl,Shared Libraries,Loader,Dynamic Linking,Fips,我正在编写一个新程序,即使用OpenSSL加密数据。我希望我的程序符合FIPS标准。为了实施FIPS模式,我使用APIFIPS\u mode\u set设置它。 我还需要将加密数据传输到第三方设备 设备供应商还提供了一个与设备通信的库。该库还依赖于OpenSSL库 我的程序直接依赖的OpenSSL库与第三方库依赖的路径不同 库的加载顺序与我的程序一起加载直接依赖的OpenSSL库。在运行时,我加载第三方库以与设备通信。作为一个副作用,它应该再次尝试从不同的路径加载OpenSSL库 对于windo

我正在编写一个新程序,即使用OpenSSL加密数据。我希望我的程序符合FIPS标准。为了实施FIPS模式,我使用APIFIPS\u mode\u set设置它。 我还需要将加密数据传输到第三方设备

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

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

库的加载顺序与我的程序一起加载直接依赖的OpenSSL库。在运行时,我加载第三方库以与设备通信。作为一个副作用,它应该再次尝试从不同的路径加载OpenSSL库

对于windows,来自不同路径的两个库都会在过程中加载,并独立工作。因此,该程序在windows上运行平稳

但是,对于Linux,只加载一个OpenSSL库。我将它设置为FIPS模式。当第三方库试图调用APIsha1_init()(非FIPS调用)时,程序正在崩溃

现在,我想知道是否有一种方法可以在Linux中独立加载这两个OpenSSL库,就像它们在windows中加载一样

如果没有,您会建议如何解决这种情况

我想知道是否有一种方法可以在Linux中独立加载这两个OpenSSL库,就像它们在windows中加载一样

UNIX(和Linux)使用完全不同的共享库模型。在Windows上,每个DLL都位于自己的世界中,是一个自包含的单元,调用自己的
malloc
,等等

在UNIX上,所有内容都在一个共享名称空间中,符号是共享的,等等

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

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

但是,使用
dlmopen
有各种复杂的要求(库必须正确指定它们的所有依赖项),并且会带来其他复杂问题(例如,您的流程空间中将有两个单独的
malloc
实现,并且您不能将它们混淆)


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

单独的过程不适合我的产品设计。让我进一步探讨dlmopen。非常感谢。