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

2024-04-17

我正在编写一个新程序,即使用 OpenSSL 加密数据。我希望我的程序符合 FIPS 标准。为了强制执行 FIPS 模式,我使用 API 进行设置FIPS_模式_集。 我还需要将加密的数据传输到第三方设备。

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

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

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

对于 Windows,来自不同路径的库都会加载到进程中,并且独立工作。所以该程序在windows上运行顺利。

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

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

如果不是,那么您建议如何解决这种情况?


我想知道是否有办法在 Linux 中独立加载这两个 OpenSSL 库,就像在 Windows 中加载它们一样?

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

在 UNIX 上,一切都在一个单一的shared命名空间、符号共享等。

Even如果您设法加载两个单独的libopenssl.so来自不同的路径,他们的symbols仍将位于单个命名空间中,并且第一个加载的库将“获胜”(将得到its使用的符号,无论调用是来自您的程序还是来自供应商库)。这是按设计.

现在轮到你can use dlmopen(GLIBC 扩展)具有完全独立的链接器“域”。这本质上将为您提供一个 Windows DLL 模型。

然而,使用dlmopen有各种复杂的要求(图书馆必须有all正确指定它们的依赖关系),并引入其他复杂性(例如,您现在将有两个独立的malloc您的进程空间中的实现,并且您不能混淆它们)。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在同一进程中从不同路径加载到同一库两次? 的相关文章

随机推荐