openssl出现非法指令错误

时间:2018-01-30 08:29:38

标签: macos openssl clang autoconf avx512

由于OSX的openssl版本已经过时,我需要在我的应用程序中捆绑更多libssllibcrypto的最新副本。

我发布的捆绑版本确实可以在非常新的系统上运行(我自己的系统和构建这些库的系统是2015 MBP) - 但是在其他一些系统上,我使用捆绑的那些产生了“非法指令”错误库。

我的问题是:

(1)是否发生了非法指令,因为二进制文件正在使用高级指令(如AVX-512),并且某些系统上不存在此指令?

(2)如何构建{em}可以 捆绑并使用绝大多数相对较新的苹果系统的版本libssllibcrypto? (不会导致非法指示..)

1 个答案:

答案 0 :(得分:1)

  

(1)非法指令是否因为先进而发生   二进制文件正在使用指令(如AVX-512)   某些系统上不存在指令?

这取决于您,您可能需要显示导致它们的代码。在过去,OpenSSL使用CPU功能探测器来查看所有(几乎所有?)平台上可用的内容。另请参阅SSL_library_init cause SIGILL when running under gdb等问题。

在最新的源代码中,OpenSSL不会在Apple平台上执行CPU功能探测,因为SIGILL会破坏内存。它是某种Apple bug,它会影响Botan,Crypto ++,OpenSSL和其他探测cpu的人。 (所有列出的库都远离Apple功能探针)。然而,这是最近的变化。另请参阅OpenSSL PR 3108, SIGILL-free processor capabilities detection on MacOS X

  

(2)我如何构建libssl和libcrypto的版本   捆绑和使用绝大多数相对较新的苹果   系统

如果您不这样做,请使用最新的OpenSSL。这应该避免Apple平台上的cpu功能探测。

该库也使用-force_cpusubtype_ALL,因此编译应该针对cpu类中功能最少的机器。这应该足以避免以后的cpu上没有的指令。

如果项目使用的是AVX-512,那么它的使用肯定会在运行时受到保护。我猜是守卫可能会检查CPUID的结果。我们需要查看使用AVX-512指令并导致SIGILL说出更多内容的相关代码。但就像我说的那样,只有在我们看到代码之后才会猜测。