【问题标题】:Illegal instruction error with opensslopenssl 出现非法指令错误
【发布时间】:2018-07-09 01:51:58
【问题描述】:

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

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

我的问题是:

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

(2) 如何构建libssllibcrypto 的版本,可以 被绝大多数相对较新的苹果系统捆绑和使用? (不会引起非法指令..)

【问题讨论】:

  • 与 AVX-512 无关,因为它目前仅在新发布的 iMac Pro 上找到。我猜更有可能是 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_INSTRUCTIONS(只需在构建设置搜索框中输入“VEC”)。

标签: macos openssl clang autoconf avx512


【解决方案1】:

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

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

在最新的资料中,OpenSSL 不会在 Apple 平台上执行 CPU 功能探测,因为 SIGILL 会破坏内存。这是某种 Apple 错误,它会影响 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 说更多的代码。但就像我说的,在我们看到代码之前,这只是一个猜测。

【讨论】:

  • 嘿,兄弟。感谢您的回复。最终,我通过将-nosse2 标志传递给./Configure 来修复它,请参见此处:github.com/openssl/openssl/blob/master/INSTALL#L391-L404 我觉得很奇怪,尽管我在绝对支持 sse2 的架构师上遇到“非法指令”错误,所以我认为该标志做的比它说的要多,并且可能会禁用 sse2 之上的其他高级指令。你知道这方面的任何事情以及它为什么起作用吗?
  • @horseyguy - 我从未使用过-nosse2,但听起来它是为了处理早期的 SSE2 支持。大约 2000 年左右 SSE2 成为 CPU 功能。但是操作系统也必须支持 SSE2,因为操作系统在使用 sse 寄存器时必须保存浮点寄存器。这就像 SIMD 单元的上下文切换,因为它们共享一个寄存器文件。上下文切换是xsavexstore 指令的原因。您链接的页面中的描述对我来说听起来有点不对劲。我认为您说 " 是对的...我认为该标志的作用比它说的要多...".
  • github.com/openssl/openssl/blob/… 永久链接到 -nosse2 标志
猜你喜欢
  • 1970-01-01
  • 2021-09-13
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多