2017-07-17 261 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

...问题是:有没有一种方法来编译crypto ++,以便部署的lib将跨平台?

是的,但只限于处理器系列。

问题可能是使用了较新的指令,但不是AES。我怀疑有三个原因。

首先,makefile在构建时添加了-march=native。这可以获得您正在构建的计算机的所有CPU功能。其次,新的指令可能来自SSE4,AVX或BMI,因为您在较新的Mac上编译;而您的旧款Mac只能处理Core2 Duo中的SSE4。第三,AES在运行时被保护,所以如果CPU缺少AESNI,那么这些特定的机器指令就不会被执行。但是,编译器可能发出的其他指令,例如AVX或BMI,则不受保护。


这里是我的OS X的测试环境:

  • 的MacBook,2010年初
    • 英特尔酷睿双核
    • OS X 10.9
    • SSE 4.1
  • 的MacBook临,201年底2
    • 英特尔酷睿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中。你需要Master,它将在即将到来的Crypto ++ 6.0中。

如果您需要删除添加-march=native的makefile代码,那么它不难找到。围绕线200打开GNUmakefile,并删除此块:

# 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上下文中的胖二进制文件。相同的概念适用于OS X.


如果遇到编译错误-msse4.1-msse4.2,那么你可能需要-msse4_1-msse4_2。不同的编译器接受(或期望)稍微不同的语法。


对于使用Linux进行比较,以下是Core2 Duo与第三代Core i5之间的CPU功能差异。注意Core i5有SSE4.2和AVX,而Core2 Duo没有。 AVX带来了巨大的变化,编译器积极使用指令集。在OS X上,你想运行sysctl machdep.cpu.features。我从2010年初向我的旧款MacBook展示了一款。

酷睿

$ 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 

Core2双核

$ 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

感谢您的时间和@jww这个漫长和描述这个问题,编译cryptopp本Answare的帮助后,我已经得到了不同的连接错误,我会固定链接错误 – zapredelom

+0

@zapredelom之后来到这个帖子leater - 那么,它很难说,因为没有细节。你应该提供的非法指令(哪一个?)的详细信息,并提供两款机器的细节。关于链接错误,你应该问,因为比这个问题的不同的新问题。 – jww

+0

谢谢。我修好了我的所有问题,你建议编译塔方式和它的工作。但有一个例外。最新提交cryptopp LIB链接包含了一些错误,所以我下载了最新的官方版本 – zapredelom