我的应用程序仅使用 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_options
和 SSL_want_read/SSL_want_write
)实际上是导致调用相同函数的宏。
另一种选择是静态链接 libcrypto.a
和 libssl.a
。这也会使您的应用程序在根本没有安装 OpenSSL 的系统上运行(尽管这些系统很少)。不过,预计这会使您的应用大小增加 300-900kb。
关于c - 链接到不同版本的 SSL 共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20483501/