Macos openssl出现非法指令错误

Macos openssl出现非法指令错误,macos,openssl,clang,autoconf,avx512,Macos,Openssl,Clang,Autoconf,Avx512,由于OSX有过时的openssl版本,我需要将libssl和libcrypto的更多最新副本与我的应用程序捆绑在一起 我发布的捆绑版本似乎在最近的系统上运行(我自己的系统和我构建这些库的系统是2015 MBP),但在其他一些系统上,我使用这些捆绑库时遇到“非法指令”错误 我的问题是: (1) 发生非法指令是否是因为二进制文件正在使用高级指令(如AVX-512),而某些系统上不存在该指令 (2) 我如何构建能被大多数相对较新的苹果系统捆绑和使用的libssl和libcrypto版本?(在不造成非法

由于OSX有过时的openssl版本,我需要将
libssl
libcrypto
的更多最新副本与我的应用程序捆绑在一起

我发布的捆绑版本似乎在最近的系统上运行(我自己的系统和我构建这些库的系统是2015 MBP),但在其他一些系统上,我使用这些捆绑库时遇到“非法指令”错误

我的问题是:

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

(2) 我如何构建能被大多数相对较新的苹果系统捆绑和使用的
libssl
libcrypto
版本?(在不造成非法指令的情况下)

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

这要视情况而定,您可能需要显示导致它们的代码。在过去,OpenSSL使用CPU特性探测来查看所有(几乎所有?)平台上都提供了什么。也可以看到这样的问题

在最新资料中,OpenSSL没有在苹果平台上执行CPU功能探测,因为
SIGILL
会破坏内存。这是某种苹果的bug,它会影响Botan、Crypto++、OpenSSL和其他探测cpu的程序。(所有列出的库都从Apple feature Probe中移出)。然而,这是最近的变化。另请参见OpenSSL

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

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

该库还使用,因此编译应该以cpu类中能力最低的机器为目标。这应该足以避免在以后的cpu上不可用的指令


如果项目使用的是AVX-512,那么它的使用在运行时肯定会受到保护。我猜警卫可能会检查
CPUID
的结果。我们需要查看使用AVX-512指令并导致
SIGILL
说明更多信息的相关代码。但正如我所说,在我们看到代码之前,这只是一个猜测。

与AVX-512无关,因为目前只有在新发布的iMac Pro上才能找到AVX-512。我猜更可能是AVX/AVX2指令的问题。“其他系统”到底是什么?@PaulR一个例子是MacPro3,1、BootROM MP31.006C.B05、8个处理器、四核Intel Xeon、2.8 GHz、24 GB、SMC 1.25f4,以及其他类似MacBook Pro(13英寸,2011年初)等的系统——这是一款Penryn“Harpertown”CPU,最高支持SSE 4.1,但没有AVX/AVX2。您可能只需要确保您的可执行文件和库都是为SSE4.1构建的,而不是为您的开发机器上的任何本机体系结构构建它们。@PaulR谢谢,我没有这样做的经验。我应该提供哪些旗帜?还有什么我应该知道的吗?对不起,我从来没有构建过libssl/libcrypto,但是您应该能够将适当的选项设置为./configure(或者他们使用的任何构建系统)。对于可执行文件,假设您使用的是Xcode,那么就有一个构建设置
CLANG_X86_VECTOR_指令
(只需在构建设置搜索框中键入“VEC”)。谢谢你的回复。最终,我通过将
-nosse2
标志传递给
/Configure
来修复它。请看这里:我发现它工作起来很奇怪,因为我在绝对支持sse2的架构上遇到了“非法指令”错误,所以我认为该标志比它所说的做得更多,可能会禁用sse2之上的其他高级指令。你知道这一点以及它为什么会起作用吗?@horseyguy-我从来没有使用过
-nosse2
,但听起来它是为了治疗早期的SSE2支持。大约2000年左右,SSE2成为CPU的一种功能。但是操作系统也必须支持SSE2,因为操作系统在使用sse寄存器时必须保存浮点寄存器。这就像SIMD单元的上下文开关,因为它们共享一个寄存器文件。上下文切换是执行
xsave
xstore
指令的原因。你链接的页面上的描述听起来有点不对劲。我认为你说的是对的,“……我认为国旗比它说的更有用……”。指向-nosse2标志的永久链接