1

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

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

我的问题是:

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

(2)我如何构建可以绝大多数相对较新的苹果系统捆绑和使用的libssl版本?(不会导致非法指令..)libcrypto

4

1 回答 1

1

(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更多信息的代码。但就像我说的,在我们看到代码之前,这只是一个猜测。

于 2018-01-31T05:59:57.520 回答