2013-12-10 57 views
2

我的應用程序只使用OpenSSL 0.9.8和更高版本支持的函數,但我在安裝了1.0.0庫的系統上(使用-lcrypto)編譯它,並且該應用程序需要libcrypto .so.1.0.0或更高版本在安裝時。鏈接到不同版本的SSL共享庫

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中使用完整版本時沒有其他庫I 「M知道做到這一點?

+1

歡迎來到地獄的奇妙世界.... –

回答

1

沒有,沒有可靠的方法,因爲在OpenSSL的內部結構保持版本之間的變化,相當多的功能,實際上其訪問/操縱結構成員直接宏。

如果你確定你的應用程序沒有使用任何這樣的宏,並且願意承擔風險,結構可能會改變,你的應用程序將無法工作,你可以使用libcrypto.so和dlsym()你使用的功能。將會有大約20個。請記住,您可能正在使用的許多功能(如SSL_CTX_set_optionsSSL_want_read/SSL_want_write)實際上是導致調用相同功能的宏。

另一種選擇是靜態鏈接libcrypto.alibssl.a。這也會讓你的應用運行在沒有安裝OpenSSL的系統上(儘管這些很少)。預計這將增加300-900kb到你的應用程序的大小。