我的应用程序仅使用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是我所知道的唯一依赖于非常特定版本级别(VRM)的库,因此我担心如果安装的库晚于libcrypto.so.1.0.0(或库),应用程序将无法运行更新到更新的级别)。
有没有办法编译我的应用程序使用“libcrypto.so或”libcrypto.so.1“无论它链接到什么版本?为什么OpenSSL使用SONAME中的完整版本没有其他库我'我知道这个吗?
答案 0 :(得分:1)
不,没有可靠的方法,因为在OpenSSL中,内部结构在版本之间不断变化,而且很多函数实际上是直接访问/操作结构成员的宏。
如果您确定您的应用程序不使用任何此类宏并且愿意冒险结构可能会更改并且您的应用程序无法正常工作,您可以dlopen()
libcrypto.so和dlsym()你使用的功能。将会有大约20个。请记住,您可能正在使用的许多功能(例如SSL_CTX_set_options
和SSL_want_read/SSL_want_write
)实际上都是宏,这会导致调用相同的功能。
另一种选择是静态链接libcrypto.a
和libssl.a
。这也可以使您的应用程序在完全没有安装OpenSSL的系统上运行(尽管这些很少)。预计这会增加300-900kb到你的应用程序的大小。