我正在尝试在我的应用中使用libwebsockets(http://libwebsockets.org/trac/libwebsockets)库来支持websockets。我需要它是安全的,所以我试图使用openssl lib构建它,我使用https://github.com/x2on/OpenSSL-for-iPhone/blob/master/build-libssl.sh脚本构建它。 CMake创建了libwebsockets项目,我稍微修改它以使用静态openssl库。然后我将此项目添加到我的工作区并构建我的应用程序。应用程序构建没有问题。当我启动它并尝试建立websocket连接时,我尝试使用SSL_CTX_new()创建新上下文时在SHA1_Final函数中崩溃。
* 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 :(得分:2)
行。我已经解决了这个问题。
NSS库具有SHA1函数,其名称与openssl具有相同的名称。我不完全理解为什么链接器没有抱怨重复的符号,但问题是openssl使用的是NSS的SHA1函数和openssl的所有其他函数。通过这样做,ssl上下文被NSS的错误函数破坏,然后在openssl函数中崩溃。
我很感激一些想法为什么链接器让它全部编译,但移动所有应用程序只使用openssl解决了我的问题。
答案 1 :(得分:0)
我有一个理由,来自其他链接器标志的-objC
允许从静态库导入所有目标c类别,这里它与openssl冲突。如果删除该标志,则将使用openssl进行链接。