1

我正在尝试在我的应用程序中使用 libwebsockets ( http://libwebsockets.org/trac/libwebsockets ) 库来支持 websockets。我需要它是安全的,所以我尝试使用我使用https://github.com/x2on/OpenSSL-for-iPhone/blob/master/build-libssl.sh脚本构建的 openssl lib 构建它。CMake 创建了 libwebsockets 项目,我稍作修改以使用静态 openssl 库。然后我将此项目添加到我的工作区并构建我的应用程序。应用程序构建没有问题。当我启动它并尝试建立 websocket 连接时,我在 SHA1_Final 函数中崩溃,而我尝试使用 SSL_CTX_new() 创建新上下文。

崩溃回溯

* 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())。

我将非常感谢任何想法为什么会发生这种情况以及如何解决它。

4

2 回答 2

2

好的。我已经确定了这个问题。

NSS 库具有与 openssl 具有相同名称的 SHA1 函数。我不完全理解为什么链接器没有抱怨重复的符号,但问题是 openssl 使用的是 NSS 的 SHA1 函数之一和 openssl 的所有其他函数。通过这样做,ssl 上下文被 NSS 的错误函数破坏,然后在 openssl 函数中崩溃。

我会很感激为什么链接器让它全部编译但移动所有应用程序只使用 openssl 解决了我的问题。

于 2013-10-22T08:05:10.533 回答
0

我有一个原因,-objC从其他链接器标志允许从静态库导入所有目标 c 类别,这里它与 openssl 冲突。如果您删除该标志,那么它将需要 openssl 进行链接。

于 2015-08-27T18:02:02.517 回答