我已经从源代码中自己构建了libcrypto.alibssl.a,将darwin64-x86_64-cc(对于64位)和darwin-i386-cc(对于32位)指定为OpenSSL的配置脚本。
lipo创建胖子库,并将它们作为依赖项添加到我的Xcode项目中。

但是,我收到一个 undefined symbol 错误:

undefined symbols for architecture x86_64:
  "_OPENSSL_ia32cap_P", referenced from:
      _AES_cbc_encrypt in libcrypto.a(aes-x86_64.o)
ld: symbol(s) not found for architecture x86_64

注意:不过,使用相同的技术在iOS上效果很好。
lipo -detailed_info libcrypto.a显示:
Fat header in: libcrypto.a
fat_magic 0xcafebabe
nfat_arch 2
architecture i386
    cputype CPU_TYPE_I386
    cpusubtype CPU_SUBTYPE_I386_ALL
    offset 48
    size 2700624
    align 2^2 (4)
architecture x86_64
    cputype CPU_TYPE_X86_64
    cpusubtype CPU_SUBTYPE_X86_64_ALL
    offset 2700672
    size 3938432
    align 2^2 (4)

最佳答案

在静态库的情况下,这似乎是x64的代码生成器中的错误。

最简单的非补丁openssl更改解决方法是在代码中的某个地方添加对OPENSSL_cleanse的引用,即使未使用它也是如此。这将修正链接时间引用。

实际发生的事情是在某些汇编代码中引用了该符号。

汇编代码只是简单地说_OPENSSL_ia32cap_P是一个外部符号,而没有使交叉链接声明需要链接到其中。这适用于libcrypto.dylib,因为在生成.dylib文件时已解决了引用。但是,在.a情况下,引用永远不会解析,因为实际上包含该符号的唯一代码是x86_64cpuid.o,只有在使用该.o提供的任何例程时,该链接才会被链接。

该文件中的符号包括OPENSSL_cleanse,因此,如果您引用此例程,则该链接有效。

10-08 00:31