【问题标题】:Does Clang lack CRC32 for ARMv8/Aarch64?Clang 是否缺少 ARMv8/Aarch64 的 CRC32?
【发布时间】:2018-01-19 09:53:25
【问题描述】:

我正在尝试为我们的 Xcode 交叉编译设置 CI。交叉编译测试了 ARMv7 和 ARMv8。除了 ARMv8 的链接时间外,一切看起来都不错:

clang++ -DNDEBUG -g2 -O3 -fPIC -pipe -Wall -miphoneos-version-min=7 -arch arm64 \
  -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.2.sdk \
  -stdlib=libc++ -c cryptlib.cpp
clang++ -DNDEBUG -g2 -O3 -fPIC -pipe -Wall -miphoneos-version-min=7 -arch arm64 \
  -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.2.sdk \
  -stdlib=libc++ -c cpu.cpp
...

clang++ -o cryptest.exe -DNDEBUG -g2 -O3 -fPIC -pipe -Wall -miphoneos-version-min=7 -arch arm64 \
  -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.2.sdk \
  -stdlib=libc++ test.o bench1.o bench2.o ... ./libcryptopp.a  

Undefined symbols for architecture arm64:

  "CryptoPP::CRC32_Update_ARMV8(unsigned char const*, unsigned long, unsigned int&)", referenced from:

      CryptoPP::CRC32::Update(unsigned char const*, unsigned long) in libcryptopp.a(crc.o)

  "CryptoPP::CRC32C_Update_ARMV8(unsigned char const*, unsigned long, unsigned int&)", referenced from:

      CryptoPP::CRC32C::Update(unsigned char const*, unsigned long) in libcryptopp.a(crc.o)

ld: symbol(s) not found for architecture arm64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

make: *** [cryptest.exe] Error 1

我们显然不运行输出工件cryptest.exe。我们只是编译和链接来测试。

代码在 LLVM Clang 下测试良好。

所有 ARMv8/Aarch64 机器都有 CRC-32 和 CRC-32C;但加密扩展是可选的。这个错误没有多大意义。

Clang 是否缺少 ARMv8/Aarch64 的 CRC32?


以下是导致错误的代码。

#if defined(__ARM_FEATURE_CRC32)

void CRC32_Update_ARMV8(const uint8_t *s, size_t n, uint32_t& c)
{
    for(; !IsAligned<uint32_t>(s) && n > 0; s++, n--)
        c = __crc32b(c, *s);

    for(; n > 4; s+=4, n-=4)
        c = __crc32w(c, *s);

    for(; n > 0; s++, n--)
        c = __crc32b(c, *s);
}

#endif

【问题讨论】:

    标签: ios xcode clang crc32 armv8


    【解决方案1】:

    在 Xcode 8.3.3 下,我在 __crc32*() 处遇到编译错误。然后我添加了命令行开关

    -march=armv8-a+crc
    

    如在this 链接中找到的,那么代码编译得很好。我用 iphone7+/iOS10.3.1 进行了测试,它工作正常。

    注意根据ARM's document(《ARM® 架构参考手册》 ARMv8,用于 ARMv8-A 架构配置文件“DDI0487B_a_armv8_arm.pdf:第 A1-58 页),crc32 指令对于 v8 是可选的,对于 v8.1 是强制性的。当我在 iphone6+/iOS9.3.3 上运行相同的程序时,它在 __crc32* 处崩溃()。我还使用内联汇编器对其进行了验证。因此,为了避免崩溃,需要进行某种运行时检查。我不完全理解如何,但作为最后的手段,我们可以使用模型名称。

    【讨论】:

    • 谢谢@beshio。 “因此,为了避免崩溃,需要进行某种运行时检查...” - 参见How to determine ARMv8 features at runtime on iOS?
    • @jww,感谢您提供的信息。我会检查链接并研究它。
    • 我不得不绕回这个话题。这通常是 Clang 问题,而不是 Apple 问题。 Clang 在运行 Linux 的通用 Aarch 板上失败了。失败是-march=armv8-a+crc
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    相关资源
    最近更新 更多