c-链接到不同版本的SSL共享库



我的应用程序只使用OpenSSL 0.9.8及更高版本中支持的函数,但我在安装了1.0.0库(带有-lcrypto)的系统上编译它,并且该应用程序在安装时需要libcrypto.so.1.0.0或更高版本。

OpenSSL显然将整个版本级别的"libcrypto.so.1.0.0"编译到库的SONAME中,所以除非存在该特定版本的库,否则我的应用程序不会运行。我知道它不会在只安装了0.9.8的系统上运行,但如果安装了1.0.1呢?

对于我使用的每一个其他共享库(-lpthreads,-lncurses,..),ldd都将SONAME显示为"libxxx.so.N",所以我只需要安装版本N。OpenSSL是我所知道的唯一一个依赖于特定版本级别(V.R.m)的库,所以我担心如果安装的库晚于libcrypto.so.1.0.0(或者库更新到更新的级别),应用程序将无法运行。

有没有一种方法可以编译我的应用程序以使用"libcrypto.so或"libcrypto.so.1",无论它链接到哪个版本?为什么OpenSSL在SONAME中使用完整版本,而我所知道的其他库都没有这样做?

不,没有可靠的方法,因为在OpenSSL中,内部结构在不同版本之间不断变化,而且相当多的函数实际上是直接访问/操作结构成员的宏。

尽管如此,如果你确信你的应用程序没有使用任何这样的宏,并且愿意冒结构可能改变和应用程序无法工作的风险,你可以dlopen()你使用的libcrypto.so和dlsym()函数。大约有20个。请记住,您可能正在使用的许多函数,如SSL_CTX_set_optionsSSL_want_read/SSL_want_write,实际上都是宏,它们会导致调用相同的函数。

另一种选择是与libcrypto.alibssl.a静态链接。这也会让你的应用程序在根本没有安装OpenSSL的系统上运行(尽管这些系统很少)。不过,预计这会为你的应用程序增加300-900kb的大小。

最新更新