Lea*_*ros 4 c c++ macos xcode openssl
我从源代码构建libcrypto.a和libssl.a自己,指定darwin64-x86_64-cc(对于64位)和darwin-i386-cc(对于32位)OpenSSL的配置脚本.
创建了fat库,lipo并将它们作为依赖项添加到我的Xcode项目中.
但是,我得到一个未定义的符号错误:
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
Run Code Online (Sandbox Code Playgroud)
注意:使用相同的技术适用于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)
Run Code Online (Sandbox Code Playgroud)
Pet*_*esh 16
它看起来是静态库案例中x64代码生成器中的一个错误.
最简单的非补丁openssl更改解决方法是OPENSSL_cleanse在代码中的某处添加引用,即使它未被使用.这将修复链接时参考.
实际发生的是在某些汇编代码中引用了符号.
汇编代码简单地说这_OPENSSL_ia32cap_P是一个extern符号,没有使交叉链接指出它需要链接.这适用于libcrypto.dylib因为引用在生成.dylib文件时被解析; 但是,在这种.a情况下永远不会解析引用,因为实际包含符号的唯一代码是x86_64cpuid.o,只有在您使用由此提供的任何例程时才会链接.o.
此文件中的符号包括OPENSSL_cleanse,因此,如果您引用此例程,则链接有效.