2017-07-17 5 views
1

私のデスクトップアプリケーションは、Crypto ++ライブラリに依存しています。最初に私はBrewからCrypto ++をインストールし、私のアプリケーションにリンクしようとしました。最初のエラーは、古いMac(古いCPU、AESNIの命令がないと思われる)にアプリケーションを実行しようとしたときに到着しました。それとクラッシュ:osxでCrypto ++クロスプラットフォームをコンパイルする方法

Crashed Thread:  56 

Exception Type:  EXC_BAD_INSTRUCTION (SIGILL) 
Exception Codes:  0x0000000000000001, 0x0000000000000000 
Exception Note:  EXC_CORPSE_NOTIFY 

Termination Signal: Illegal instruction: 4 
Termination Reason: Namespace SIGNAL, Code 0x4 
Terminating Process: exc handler [0] 

その後、私は古いMacでcrytpo ++をコンパイルしました。今のところすべてがよかったです。しかし、最近私は、古いCPUでも同じエラーが発生しました。

基本的な質問は次のとおりです。Crypto ++をコンパイルする方法があるので、展開されたlibはクロスプラットフォームですか?

答えて

1

...質問があります:暗号化された++をコンパイルする方法がありますので、展開されたライブラリはクロスプラットフォームですか?

はい、ただし、プロセッサフ​​ァミリ内のみです。

問題は新しい命令を使用する可能性がありますが、AESでは使用できません。私がそれを疑う3つの理由があります。

まず、メークファイルはビルド時に-march=nativeを追加します。これにより、あなたが構築しているマシンのすべてのCPU機能が得られます。

新しいMacでコンパイルするので、新しい命令はSSE4、AVXまたはBMIからのものである可能性があります。古いMacではCore2 Duoの場合はSSE4しか扱えませんが、

第3に、AESは実行時にガードされるため、CPUにAESNIがない場合、これらの特定のマシン命令は実行されません。ただし、AVXやBMIのように、コンパイラが発行する可能性のある他の命令は保護されません。

  • のMacBook、2010
    • インテルCore2のデュオ
    • OS X 10.9
    • SSE 4.1
  • MacBookの早期:


    は、ここに私のOS Xのテスト環境ですPro、201後半上記のリストに基づいて2

    • インテルCore i7の
    • OS X 10.8
    • SSE 4.1、SSE 4.2、AESNI、RDRAND、AVX

、私はMacBookの上でコンパイルした場合Pro(SSE 4.1、SSE 4.2、AESNI、RDRAND、AVX)をMacBook(SSE 4.1)用に使用する場合は、ターゲットマシンをSSE 4.1に制限する必要があります。それ以外の場合、Clangは古いMacBookで処理できない指示を確実に出します。暗号++でのターゲットマシンに制限するには

git clone https://github.com/weidai11/cryptopp.git 
cd cryptopp 

export CXXFLAGS="-DNDEBUG -g2 -O2 -DDISABLE_NATIVE_ARCH=1 -msse2 -msse3 -mssse3 -msse4.1" 
make -j 4 

-DDISABLE_NATIVE_ARCHは比較的新しく追加されました。私はCrypto ++ 5.6.5で信じていません。あなたはそれのためにマスターが必要で、それは今後のCrypto ++ 6.0になります。

-march=nativeを追加するメークファイルコードを削除する必要がある場合は、それを見つけるのは難しくありません。 GNUmakefileを開き、ライン200の周りにこのブロックを削除します。その後

# BEGIN_NATIVE_ARCH 
# Guard use of -march=native (or -m{32|64} on some platforms) 
# Don't add anything if -march=XXX or -mtune=XXX is specified 
ifeq ($(DISABLE_NATIVE_ARCH),0) 
ifeq ($(findstring -march,$(CXXFLAGS)),) 
ifeq ($(findstring -mtune,$(CXXFLAGS)),) 
    ifeq ($(GCC42_OR_LATER)$(IS_NETBSD),10) 
     CXXFLAGS += -march=native 
    else ifneq ($(CLANG_COMPILER)$(INTEL_COMPILER),00) 
     CXXFLAGS += -march=native 
    else 
    # GCC 3.3 and "unknown option -march=" 
    # Ubuntu GCC 4.1 compiler crash with -march=native 
    # NetBSD GCC 4.8 compiler and "bad value (native) for -march= switch" 
    # Sun compiler is handled below 
    ifeq ($(SUN_COMPILER)$(IS_X64),01) 
     CXXFLAGS += -m64 
    else ifeq ($(SUN_COMPILER)$(IS_X86),01) 
     CXXFLAGS += -m32 
    endif # X86/X32/X64 
    endif 
endif # -mtune 
endif # -march 
endif # DISABLE_NATIVE_ARCH 
# END_NATIVE_ARCH 

、あなたは両方のマシンで、あなたのバイナリを実行することができます。

GNUmakefileは怪しいものです。それにはたくさんのことがあります。私たちはCrypto ++ wikiのGNUmakefileにそれを文書化しました。


-mtuneを使用してコンパイルするマシンを制限することもできます。たとえば:

$ export CXXFLAGS="-DNDEBUG -g2 -O2 -mtune=core2" 
$ make -j 3 
g++ -DNDEBUG -g2 -O2 -mtune=core2 -fPIC -pipe -c cryptlib.cpp 
g++ -DNDEBUG -g2 -O2 -mtune=core2 -fPIC -pipe -c cpu.cpp 
g++ -DNDEBUG -g2 -O2 -mtune=core2 -fPIC -pipe -c integer.cpp 
... 

まず私が醸造を使用していないので、私は知らない...ブリューと自分のアプリケーションとのリンクから++暗号化をインストールする

を試してみましたそれを使用するときCXXFLAGSを設定する方法。うまくいけば、自家製の人々の一人は、それに関するいくつかの情報を提供するでしょう。

Build and install Brew apps that are x86_64 instead of i386?Using Homebrew with alternate GCCが役立ちます。


x86_64マシンでコンパイルしてからi386マシンで実行することもできます。そうであれば、うまくいかないでしょう。

以下のようにファットライブラリを構築することができ、両方のマシンで動作する可能性があります。 -arch x86_64 -arch i386の追加に注目してください。

export CXXFLAGS="-DNDEBUG -g2 -O2 -DDISABLE_NATIVE_ARCH=1 -arch x86_64 -arch i386 -msse2 -msse3 -mssse3 -msse4.1" 
make -j 4 

また、Crypto ++ wikiのiOS (Command Line)に興味があります。これは、iOSのコンテキストで脂肪のバイナリに関するいくつかの詳細に入ります。同じ概念は、あなたが-msse4.1-msse4.2のためにコンパイルエラーが発生した場合は、あなたが-msse4_1-msse4_2が必要な場合がありますOS Xの


に適用されます。異なるコンパイラは、わずかに異なる構文を受け入れる(または期待する)。


Linuxを使って比較すると、Core2 Duoと3rd gen Core i5のCPU機能の違いは次のとおりです。 Core i5にはSSE4.2とAVXがあり、Core2 Duoにはないことに注意してください。 AVXは違いを生み出し、コンパイラは積極的に命令セットを使用します。

OS Xでは、sysctl machdep.cpu.featuresを実行します。私は2010年初めから古いMacBook用のものを示した。

コアi5:

$ cat /proc/cpuinfo 
processor  : 0 
vendor_id  : GenuineIntel 
cpu family  : 6 
model   : 58 
model name  : Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz 
... 
flags   : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca 
cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc 
rep_good nopl xtopology nonstop_tsc cpuid pni pclmulqdq ssse3 cx16 sse4_1 
sse4_2 x2apic popcnt aes xsave avx rdrand hypervisor lahf_lm 

コア2デュオ

$ cat /proc/cpuinfo 
processor  : 0 
vendor_id  : GenuineIntel 
cpu family  : 6 
model   : 23 
model name  : Intel(R) Core(TM)2 Duo CPU  T6500 @ 2.10GHz 
... 
flags   : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca 
cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm 
constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 
monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dtherm 

Core Duoプロセッサ(MacBookの)

$ sudo sysctl machdep.cpu.features 
machdep.cpu.features: FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE 
MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE SSE2 SS HTT TM PBE SSE3 DTES64 
MON DSCPL VMX SMX EST TM2 SSSE3 CX16 TPR PDCM SSE4.1 
+0

あなたのお時間をありがとう、この長い説明的な答え、このanswareの助けを借りてcryptoppをコンパイルした後、私はリンクエラーを修正した後、この投稿に来るでしょう – zapredelom

+0

@zapredelom - まあ、細部がないので、言いにくいです。あなたは違法な指示の詳細を提供するべきですか(どちらですか?)、あなたの2台のマシンの詳細を提供してください。リンクエラーに関しては、この質問とは異なるので、おそらく新しい質問をするべきです。 – jww

+0

ありがとうございます。私はすべての私の問題を修正し、あなたが提案した方法でそれを編集し、それがうまくいった。 1つ例外があります。最新のcryptopp libにはリンクエラーが含まれていたので、私は公式の最新リリース – zapredelom

関連する問題