EVP_MD_CTX_destroy 使用 openssl 1.1 链接到动态库时出现段错误
EVP_MD_CTX_destroy segfaults when linking to a dynamic lib using openssl 1.1
我们的应用程序一直使用内部开发的共享库,它动态链接到 openssl 1.0(我们库中的实际 EVP_xxx 符号未定义)。到目前为止一切顺利。
这周我一直在集成第 3 方共享库,其中定义了 openssl 1.1 符号,导致我们的 openssl 1.0 代码路径崩溃。
这怎么可能? 1.0 代码路径使用 EVP_MD_CTX_create 和 EVP_MD_CTX_destroy,而第 3 方库引入 EVP_MD_CTX_new 和 EVP_MD_CTX_free。所以不应该是这样。
在分配和销毁之间,有几个 SSL 操作正在进行,例如 EVP_DigestSignInit。
我注意到这个符号在 1.0 和 1.1 中都存在。是否有可能在链接定义了此符号的第 3 方共享库时,链接到 1.1 版本,导致 EVP_MD_CTX_create 分配的对象出现混乱?
如果是,如何避免这些 1.1 符号弄乱我们的 1.0 代码路径?
可能相关的详细信息:C++14、GCC、Ubuntu18.04
How is this possible?
在 Linux(和其他 UNIX)上加载两个不同版本的 openssl
(或任何其他共享库)是不安全的,几乎总是会导致错误或崩溃。
这是因为(按照设计)UNIX 共享库不是彼此隔离的(与 Windows DLL 不同)。第一个定义任何给定符号的库“获胜”,并且该符号的所有使用都将使用第一个定义,即使后续库也定义了该符号。
最好的方法是使用单一版本的 openssl
。
您可能能够使用dlmopen
(即Linux/GLIBC-specific)在单个进程中使用两个不兼容的库,但您应该准备好选择那条路要忍受很多痛苦
我们的应用程序一直使用内部开发的共享库,它动态链接到 openssl 1.0(我们库中的实际 EVP_xxx 符号未定义)。到目前为止一切顺利。
这周我一直在集成第 3 方共享库,其中定义了 openssl 1.1 符号,导致我们的 openssl 1.0 代码路径崩溃。
这怎么可能? 1.0 代码路径使用 EVP_MD_CTX_create 和 EVP_MD_CTX_destroy,而第 3 方库引入 EVP_MD_CTX_new 和 EVP_MD_CTX_free。所以不应该是这样。
在分配和销毁之间,有几个 SSL 操作正在进行,例如 EVP_DigestSignInit。 我注意到这个符号在 1.0 和 1.1 中都存在。是否有可能在链接定义了此符号的第 3 方共享库时,链接到 1.1 版本,导致 EVP_MD_CTX_create 分配的对象出现混乱?
如果是,如何避免这些 1.1 符号弄乱我们的 1.0 代码路径?
可能相关的详细信息:C++14、GCC、Ubuntu18.04
How is this possible?
在 Linux(和其他 UNIX)上加载两个不同版本的 openssl
(或任何其他共享库)是不安全的,几乎总是会导致错误或崩溃。
这是因为(按照设计)UNIX 共享库不是彼此隔离的(与 Windows DLL 不同)。第一个定义任何给定符号的库“获胜”,并且该符号的所有使用都将使用第一个定义,即使后续库也定义了该符号。
最好的方法是使用单一版本的 openssl
。
您可能能够使用dlmopen
(即Linux/GLIBC-specific)在单个进程中使用两个不兼容的库,但您应该准备好选择那条路要忍受很多痛苦