Clang是否缺少ARMv8 / Aarch64的CRC32?

问题描述 投票:2回答:1

我正在尝试为我们的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;但是Crypto扩展名是可选的。该错误没有多大意义。

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个回答
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 * ()。我还使用内联汇编器对其进行了验证。为避免崩溃,因此,必须进行某种运行时检查。我不完全了解如何进行操作,但作为最后的选择,我们可以使用模型名称。] >

© www.soinside.com 2019 - 2024. All rights reserved.