2013-10-17 288 views
1

我想在我的應用程序中使用libwebsockets(http://libwebsockets.org/trac/libwebsockets)庫支持websockets。我需要它是安全的,所以我正在嘗試使用我使用https://github.com/x2on/OpenSSL-for-iPhone/blob/master/build-libssl.sh腳本構建的openssl庫來構建它。 CMake創建libwebsockets項目,我稍作修改以使用靜態openssl庫。然後我將這個項目添加到我的工作區並構建我的應用程序。應用程序的構建沒有問題。當我啓動它並嘗試建立websocket連接時,我嘗試使用SSL_CTX_new()創建新的上下文時,在SHA1_Final函數中崩潰。libwebsockets lib與SSL openssl for iOS中崩潰崩潰SSL_CTX_new()

Crash backtrace

* thread #1: tid = 0x2503, 0x000fa47e MyApp`SHA1_Final + 22, queue = 'com.apple.main-thread, stop reason = EXC_BAD_ACCESS (code=1, address=0x22986341) 
frame #0: 0x000fa47e MyApp`SHA1_Final + 22 
frame #1: 0x00130a90 MyApp`EVP_DigestFinal_ex + 56 
frame #2: 0x0012e45c MyApp`ssleay_rand_add + 492 
frame #3: 0x0012f056 MyApp`RAND_poll + 614 
frame #4: 0x0012e726 MyApp`ssleay_rand_bytes + 166 
frame #5: 0x000ef49c MyApp`SSL_CTX_new + 464 
frame #6: 0x00153218 MyApp`libwebsocket_create_context(info=0x2fda90bc) + 1364 at libwebsockets.c:1975 

我也有NSS庫(https://developer.mozilla.org/en-US/docs/NSS)和一堆這是需要在我的項目其他圖書館其他安全相關的文件。

我試圖創建一個視圖,只有libwebsockets和openssl庫,並在該項目openssl不會崩潰的簡單測試項目。

我猜我的問題是與相同項目中存在的nss和openssl庫相關,或者與openssl和其他項目可能的不同編譯設置有關。 (是的,我檢查過,libwebsockets lib調用SSL_library_init())。

我非常感謝爲什麼會發生這種情況以及如何解決它的任何想法。

+0

你可以讓我知道你「如何修改使用靜態openssl庫」? libwebsockets w/ssl在從xcode運行時工作正常,但是當通過TestFlight distrod(並且我假設appstore)時,我得到了崩潰。我認爲它試圖使用動態庫。謝謝! – braden

+0

嗨,我想編譯iOS的libwebsocket庫,但我面臨的問題「CMake Error toolchain/iOS.cmake:101(message): 沒有iOS SDK的默認搜索路徑 /Developer/Platforms/iPhoneSimulator。 platform/Developer。手動設置 CMAKE_IOS_SDK_ROOT或安裝iOS SDK。「請給我一些提示你是如何編譯libwebsocket庫的iOS – Mahesh

+0

@Mahesh好吧,CMAKE已經給你提示了。您要麼沒有iOS SDK,要麼在路徑上遇到麻煩。 – user1264176

回答

2

好的。我已經確定了這個問題。

NSS庫具有與openssl具有相同名稱的SHA1函數。我不完全理解爲什麼鏈接器不會抱怨重複的符號,但問題在於openssl使用NSS的SHA1函數和openssl的所有其他函數。通過這樣做,ssl上下文被來自NSS的錯誤函數破壞,然後在openssl函數中崩潰。

我將不勝感激爲什麼連接器讓它全部編譯,但移動所有的應用程序只使用openssl解決了我的問題。

+0

你有什麼功能需要改變?對於閱讀此內容的其他人來說,這將是一個很好的信息:) – braden

+0

@braden正如我在回答中所寫的那樣,我有兩個連接到我的應用程序的ssl庫(NSS和openssl),它們都具有相同名稱的SHA1函數。鏈接器沒有抱怨重複的符號,但在運行時使用了不正確的函數,導致崩潰。 – user1264176

+0

@braden只是爲了澄清:我最終刪除了openssl,以支持該項目的NSS。 – user1264176

0

我有一個背後的原因,其他鏈接器標誌-objC允許從靜態庫中導入所有目標c類別,這裏它與openssl衝突。如果你刪除該標誌,那麼它將採取openssl進行鏈接。