我们正在编译一个32位应用程序,该应用程序与静态版本cryptopp
链接。
gcc: 4.4.7
CPU: Intel Xeon E5-2680
操作系统: CentoOS 6.5
加密++: 5.6.2
我们的程序在这台机器上编译并运行良好。当我们尝试运行时
CPU: Intel Xeon X5690
操作系统: CentoOS 6.5
gcc: 4.4.6
我们在cryptopp中遇到了分段错误 - > rijndael.cpp - > Rijndael :: Base :: UncheckedSetKey()调用_mm_loadu_si128()
如果我们在CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE设置为0的情况下构建cryptopp,则一切运行正常。似乎AES-NI应该在这个服务器上可用,并且对HasAESNI()的cryptopp调用返回true。
有关可能导致此问题的原因或如何进一步追踪的任何想法?
答案 0 :(得分:0)
在E5-2680上编译并复制到X5690时出现错误。
哦,这很有意思。尝试将-mtune=pentium4
添加到CXXFLAGS
。 Intel Xeon E5-2680具有AVX指令集;而英特尔至强X5690只有SSE 4.2。 Crypto ++使用AVX指令集(其他处理器缺少的)的双四字乘法(PCLMULQDQ
)和AES-NI
指令。
如果-mtune=pentium4
不起作用,那么您将不得不通过CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE
停用。现在我考虑一下,这就是你可能要做的事情,因为这是编译时特征选择,而不是运行时特征选择。
答案 1 :(得分:0)
英特尔(R)Xeon(R)CPU E5606 @ 2.13GH"不支持" AESNI "指令也是。我已经在"英特尔至强 E312xx (Sandy Bridge)"上编译了Crypto ++,并在" E5606 "上得到了相同的错误。 !禁用" AESNI"在CMakeLists.txt文件中,打开" DISABLE_AESNI"选项。
option(DISABLE_AESNI "Disable AES-NI" ON)