Apple Clang在Xcdoe 10下是否缺less针对ARMv8 / Aarch64的CRC32?

我试图为我们的Xcode交叉编译设置configuration项。 交叉编译testingARMv7和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 。 我们只是编译和链接来testing的东西。

代码已经在LLVM Clang下进行了很好的testing。

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

Apple Clang在Xcode 10下是否缺less针对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 

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

 -march=armv8-a+crc 

在这个链接中find,那么代码编译良好。 我testing了iPhone7 + / iOS10.3.1,它的工作。

请注意,根据ARM的文档 (“ARM®体系结构参考手册ARMv8,ARMv8-A体系结构configuration文件”DDI0487B_a_armv8_arm.pdf:第A1-58页),crc32指令对于v8.1是可选的,对于v8.1是必需的。 当我在iphone6 + / iOS9.3.3上运行相同的程序时,它崩溃在__crc32 *()。 我也用内联汇编器来validation它。 因此,为了避免崩溃,需要进行某种运行时检查。 我不完全明白,但作为最后的手段,我们可以使用模型名称。