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

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(使用前将#替换为@)

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

  • 修改编译共享库中符号的可见性

    我的项目依赖于一个第三方库 该库导出了更多应有的符号 其中一些符号被其他库和主程序无意地覆盖 如何更改已编译共享对象的函数和变量的可见性 如何更改已编译共享对象的函数和变量的可见性 您可以通过修改动态符号部分来更改符号的可见性 dynsym
  • 使用openssl从服务器获取证书

    我正在尝试获取远程服务器的证书 然后可以将其添加到我的密钥库中并在我的 Java 应用程序中使用 一位高级开发人员 正在度假 告诉我我可以运行这个 openssl s client connect host host 9999 获取转储的原
  • 如何重命名共享库以避免同名冲突?

    我找到了一个图书馆 libjson http sourceforge net projects libjson 我正在尝试将其构建为共享库并在项目中使用 建造很简单 修复 Makefile 错误后 SHARED 1 make install
  • OpenSSL的EVP是什么意思?

    OpenSSL的EVP是什么意思 我知道它是 OpenSSL 中的一个更高级别的加密接口库 但是字母 E V P 代表什么 谢谢 陈兹 有趣的问题 我不确定 但是 ifndefevp h 顶部是 ifndef HEADER ENVELOPE
  • 编译器 libstdc++ 版本与系统版本

    我试图了解 g 如何选择它链接的 libstdc 版本 以及当库的 系统 版本不同时它意味着什么 我正在使用 gcc g 4 1 2 根据ABI 指南 http gcc gnu org onlinedocs libstdc manual a
  • 如何验证公钥是由您的私有 CA 颁发的?

    我创建了一个 CA 证书 并用它来颁发公钥 在将来的某个日期 我需要验证加载的证书是否由我的 CA 颁发 如何使用 OpenSSL API c 做到这一点 我已将 verify c 在 openssl apps 中 减少到所需的最少功能 假
  • 如何将 OpenSSL 与 WinSock 一起使用?

    我在网上搜索过 但没有找到任何与此相关的内容 有谁有使用 WinSock 和 OpenSSL 的简单代码示例吗 我正在寻找一个简单的 Visual C 2005 或更高版本的代码示例 它创建并打开一个 Winsock 连接 并使用 Open
  • openssl_crypt 中初始化向量的使用

    我看了一下this https stackoverflow com questions 1391132 two way encryption in php问题 并想为自己做 当我运行这段代码时 直接取自这个答案 https stackove
  • 使用 PKCS1 生成私钥 RSA

    有没有办法在 PHP 中通过 OpenSSL 生成私钥openssl pkey 新 http php net manual en function openssl pkey new php在 RSA 和 PKCS1 中 如果您的意思是带有
  • 如何将 pem 公钥转换为 openssl RSA* 结构

    假设我必须像这样公开 pem 密钥 BEGIN PUBLIC KEY MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7vbqajDw4o6gJy8UtmIbkcpnk O3Kwc4qsEnSZp TR fQi
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • ctypes 错误:libdc1394 错误:无法初始化 libdc1394

    我正在尝试将程序编译为共享库 我可以使用 ctypes 在 Python 代码中使用该库 使用以下命令该库可以正常编译 g shared Wl soname mylib O3 o mylib so fPIC files pkg config
  • 无法通过 Git Bash 克隆 git 存储库

    在尝试使用克隆存储库时git clone 它显示以下错误 致命 无法访问 https github com microsoft c9 python getting started git https github com microsoft
  • Jenkins 共享库:“java.lang.NoSuchMethodError:没有这样的 DSL 方法”

    我正在尝试通过 Jenkinsfile 和共享库创建 Jenkins 管道 我通过 Web UI 创建了一个作业来获取 Jenkinsfile 它工作正常 但是 共享库内容似乎无法被 Jenkins 识别 下面是 Jenkinsfile 和
  • 创建 C++ Redis 模块 - “不导出 RedisModule_OnLoad() 符号”

    我在加载 Redis 模块时遇到一些问题 我只是复制来自的示例https redis io topics modules intro https redis io topics modules intro 但我把它剥下来了 include
  • GNU ld 是否有一个选项可以完全省略 -dynamic-linker (PT_INTERP)?

    我正在 Linux 上试验纯静态链接 PIE 可执行文件的概念 但遇到了以下问题 GNU binutils 链接器坚持在输出二进制文件中添加 PT INTERP 标头 pie被使用 即使也给出 static 有什么办法可以抑制这种行为吗 也
  • Rails:自动加载库不起作用

    由于某种原因我的自动加载器无法工作 我遵循了一些教程 这是我的 config application rb 文件的样子 require File expand path boot FILE require rails all Bundler
  • “openssl 编程简介。”文章。过期的证书

    我是 openSSL 库和 PKI 的新手 我有一个简单的问题要问 openSSL 专家 有谁知道如何为本文中的代码示例创建证书 OpenSSL 编程简介 第一部分 第二部分 作者 Eric Rescorla www rtfm com op
  • openSSL:PEM_write_RSAPublicKey 和 PEM_write_RSA_PUBKEY 之间的区别

    在 openssl 库中 我可以看到两种将公钥写入文件的方法 int PEM write RSAPublicKey FILE fp RSA x int PEM write RSA PUBKEY FILE fp RSA x 在文档中我可以看到
  • 如何查看共享库加载的顺序

    给定一个 ELF 二进制文件或共享对象 我如何才能最轻松地查看所需共享库的加载顺序 它们是否按照列出的顺序加载readelf d 我怎样才能最容易地看到所需共享库的加载顺序 Use LD DEBUG LD DEBUG files bin l

随机推荐