(1) 非法指令的发生是因为二进制文件正在使用高级指令(例如 AVX-512),而在某些系统上不存在该指令?
这取决于,您可能需要显示导致它们的代码。过去,OpenSSL 使用 CPU 功能探测来查看所有(几乎所有?)平台上可用的内容。另请参阅SSL_library_init 在 gdb 下运行时导致 SIGILL等问题。
在最新的资料中,OpenSSL 不会在 Apple 平台上执行 CPU 功能探测,因为它会SIGILL
破坏内存。这是某种 Apple 错误,它会影响 Botan、Crypto++、OpenSSL 和其他探测 CPU 的设备。(所有列出的库都从 Apple 功能探针中移出)。然而,这是最近的变化。另请参阅 OpenSSL PR 3108,MacOS X 上无 SIGILL 的处理器功能检测。
(2) 我如何构建可以被绝大多数相对较新的苹果系统捆绑和使用的 libssl 和 libcrypto 版本?
如果您不这样做,请使用最新的 OpenSSL。这应该避免 Apple 平台上的 cpu 功能探测。
该库还使用-force_cpusubtype_ALL
,因此编译应针对 cpu 类中能力最差的机器。这应该足以避免以后的 cpu 上不可用的指令。
如果项目使用的是 AVX-512,那么它的使用肯定在运行时受到保护。我的猜测是警卫可能会检查CPUID
. 我们需要查看使用 AVX-512 指令并导致SIGILL
更多信息的代码。但就像我说的,在我们看到代码之前,这只是一个猜测。