由于OSX的openssl版本已经过时,我需要在我的应用程序中捆绑更多libssl
和libcrypto
的最新副本。
我发布的捆绑版本确实可以在非常新的系统上运行(我自己的系统和构建这些库的系统是2015 MBP) - 但是在其他一些系统上,我使用捆绑的那些产生了“非法指令”错误库。
我的问题是:
(1)是否发生了非法指令,因为二进制文件正在使用高级指令(如AVX-512),并且某些系统上不存在此指令?
(2)如何构建{em}可以 捆绑并使用绝大多数相对较新的苹果系统的版本libssl
和libcrypto
? (不会导致非法指示..)
答案 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
说出更多内容的相关代码。但就像我说的那样,只有在我们看到代码之后才会猜测。