在启用AESNI内在函数的情况下未能调用_mm_loadu_si128()

时间:2014-02-28 16:41:13

标签: gcc centos intel crypto++

我们正在编译一个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。

有关可能导致此问题的原因或如何进一步追踪的任何想法?

2 个答案:

答案 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)