2017-08-11 10 views
2

Xcodeのクロスコンパイル用にCIをセットアップしようとしています。クロスコンパイルは、ARMv7とARMv8の両方をテストします。物事はそれがARMv8のリンクをクリックする時間が来るときを除き、よく見る:Apple ClangはXcdoe 10でARMv8/Aarch64のCRC32が不足していますか?

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があります。暗号拡張はオプションです。エラーはあまり意味がありません。

Apple ClangにはXcode 10での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 

答えて

1

Xcode 8.3.3では、__crc32 *()でコンパイルエラーが発生しました。 thisリンクで発見、コードがうまくコンパイルとして、私は、コマンドラインスイッチ

-march=armv8-a+crc 

を加えました。私はiphone7 +/iOS10.3.1でテストしたところ、動作しています。 ARM's documentに応じ

ノート( "ARM®アーキテクチャリファレンスマニュアル ARMv8は、ARMv8アーキテクチャのプロファイルの" DDI0487B_a_armv8_arm.pdf:ページA1-58)、CRC32命令はV8とV8.1のための必須のためのオプションです。 iphone6 +/iOS9.3.3で同じプログラムを実行すると、__crc32 *()でクラッシュしました。私はインラインアセンブラでも検証しました。したがって、クラッシュを避けるためには、何らかのランタイムチェックが必要です。私は方法を完全に理解していませんが、最後の手段としてモデル名を使用することができます。

+0

ありがとう@beshio。したがって、クラッシュを回避するには、実行時のチェックが必要です。」* - [iOSで実行時にARMv8の機能を判断する方法](https://stackoverflow.com/q/45637888/)を参照してください。 608639) – jww

+0

@jww、情報ありがとうございます。私はリンクを確認し、それを勉強します。 – beshio

関連する問題