【问题标题】:Undefined symbols for architecture x86_64 on OS X with fat library带有胖库的 OS X 上架构 x86_64 的未定义符号
【发布时间】:2015-05-10 17:24:51
【问题描述】:

我自己从源代码构建了libcrypto.alibssl.a,将darwin64-x86_64-cc(64 位)和darwin-i386-cc(32 位)指定为OpenSSL 的配置脚本。
使用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

注意:不过,对于 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)

【问题讨论】:

  • 您是否安装了这些库的头文件?通常有一个二进制包发行版,它只有库,以及一个单独的开发包,用于库和用于对库进行编码的相关标头。
  • 我已经包含了正确的标题。
  • i386 和 x86_64 的标头略有不同。虽然胖库正确构建(或与lipo 正确组合),但除一个切片外,所有切片的标题都会略微偏离。但皮特什是对的。我似乎记得在某些情况下是导出的(如静态存档),但不是在其他情况下(如共享对象)。 How can I check if OpenSSL is suport/use the Intel AES-NI? 提到了这个问题

标签: c++ c xcode macos openssl


【解决方案1】:

在静态库的情况下,它看起来是 x64 的代码生成器中的一个错误。

最简单的非补丁 openssl 更改解决方法是在代码中的某处添加对 OPENSSL_cleanse 的引用,即使它没有被使用。这将修复链接时引用。

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

汇编代码只是说_OPENSSL_ia32cap_P 是一个外部符号,没有进行交叉链接以表明它需要被链接。这适用于libcrypto.dylib,因为在生成.dylib 时解析了引用文件;但是,在 .a 的情况下,该引用永远不会被解析,因为实际包含该符号的唯一代码是 x86_64cpuid.o,只有当您使用该 .o 提供的任何例程时,它才会被链接。

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

【讨论】:

  • 这就是我最终使用您的建议所做的事情:extern int OPENSSL_cleanse(void *ptr, size_t len);
  • 在代码中任意位置:OPENSSL_cleanse(nil, 0);
  • 我在编译 libevent 时遇到了类似的问题。我在代码中添加了 OPENSSL_cleanse 但未能修复它,最后我将 x86_64cpuid.o 路径添加到相对 Makefile 来修复它。谢谢!
【解决方案2】:

我偶然发现了同样的链接器错误,我还尝试添加行 extern int OPENSSL_cleanse(void *ptr, size_t len); 没有成功。

最终对我有用的是在代码文件的任何位置添加以下行:

uint32_t OPENSSL_ia32cap_P[4] = { 0 };

另外,我使用以下链接作为参考:https://boringssl.googlesource.com/boringssl/+/517073cd4b/crypto/cpu-intel.c#76

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-26
    • 2017-08-21
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多