加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – OS X上具有胖库的体系结构x86_64的未定义符号

发布时间:2020-12-14 18:56:16 所属栏目:百科 来源:网络整理
导读:我自己从源代码构建了libcrypto.a和libssl.a,将darwin64-x86_64-cc(对于64位)和darwin-i386-cc(对于32位)指定为OpenSSL的configure脚本. 使用lipo创建了fat库,并将它们作为依赖项添加到我的 Xcode项目中. 但是,我得到一个未定义的符号错误: undefined symbo
我自己从源代码构建了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,因此如果您引用此例程,则链接有效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读