OS X上带有胖库的架构x86_64的未定义符号
我自己从源代码构建了libcrypto.a
和libssl.a
,将darwin64-x86_64-cc
(对于64位)和darwin-i386-cc
(对于32位)指定为OpenSSL
的configure脚本。
使用lipo
创建了fat库,并将它们作为依赖项添加到我的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
注意:使用相同的技术适用于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
是一个extern符号,没有使交叉链接指出它需要链接。这适用于libcrypto.dylib
因为生成.dylib
文件时引用被解析; 但是在.a
情况下永远不会解析引用,因为实际包含该符号的唯一代码是x86_64cpuid.o
,如果您使用该.o
提供的任何例程,它只会被链接。
此文件中的符号包括OPENSSL_cleanse
,因此如果您引用此例程,则链接有效。