在视觉C++ malloc 警告中静态链接 openssl

Statically link openssl in Visual C++ malloc warning

本文关键字:静态 链接 openssl 警告 视觉 C++ malloc      更新时间:2023-10-16

OpenSSL 1.0.2g 软件包的 INSTALL.W32 文档具有以下警告文本:

关于编译链接到OpenSSL库的应用程序的最后一点评论。 如果不使用多线程 DLL 运行时库(/MD 选项),则 程序几乎肯定会崩溃,因为 Malloc 感到困惑—— OpenSSL DLL 静态链接到一个版本,应用程序必须 不要使用其他的。

我不完全理解这一点或它的影响。他们是说不支持静态链接 libeay32mt.lib 吗?

我们在应用程序中遇到随机崩溃,堆栈跟踪有时指向 openssl 函数中的免费调用,这是否是此警告所指的预期症状?

C

和C++内存管理在 CRT(C 运行时库)中实现。映射到进程(静态编译为模块或引用的 DLL)的 CRT 的每个物理副本都使用不同的堆。内存分配和解除分配必须在同一堆(即同一物理 CRT 副本)上执行(有关详细信息,请参阅跨 DLL 边界传递 CRT 对象的潜在错误)。

在特定方案中,需要确保执行以下操作:

  • 将应用程序与 OpenSSL DLL 动态链接。
  • 将应用程序与 CRT 动态链接。
  • 验证应用程序和 OpenSSL DLL 是否链接到相同版本的 CRT(版本和配置)。

虽然可以静态链接到 OpenSSL,但如果您可以确保最终二进制文件包含单个 CRT 实现,并且不会(直接或间接)动态链接到 CRT。这很难维护,并且一旦链接到不提供静态库的库就会中断。