【问题标题】:What is the "Illegal Instruction: 4" error and why does "-mmacosx-version-min=10.x" fix it?什么是“非法指令:4”错误,为什么“-mmacosx-version-min=10.x”会修复它?
【发布时间】:2012-12-25 11:42:12
【问题描述】:

当这些二进制文件在 Mac OS X 10.7.x(“Lion”)和更早版本下运行时,我在 Mac OS X 10.8.2(“Mountain Lion”)下使用 GCC 4.7.2 编译的二进制文件出现 Illegal Instruction: 4 错误版本。二进制文件在 Mac OS X 10.8.x 下正常工作。

我在编译标志中添加了-mmacosx-version-min=10.5,这似乎有助于解决 10.5.x、10.6.x 和 10.7.x 客户端的问题,无论是什么问题。

我的问题是什么:

  • Illegal Instruction: 4 错误是什么?
  • 为什么-mmacosx-version-min=10.x 会在10.x 及更高版本的客户端上修复此特定错误?

我想将此修复应用到我的 makefile,但想在我扣动扳机之前知道它在做什么。 (我会有更大的二进制文件吗?我还有 64 位二进制文​​件吗?我应该知道这种方法的陷阱吗?意外的副作用?等等)

【问题讨论】:

  • Snow Leopard 是 Mac OSX 10.6,请澄清/更正
  • 缺少返回值可能会导致“非法指令:4”。我昨天遇到了这个。注意我的编译器警告让我走上了正确的轨道。
  • 七年前我问过这个问题,今天无法为您提供帮助,抱歉。我确实记得曾尝试为旧版本的 Mac OS X 分发二进制文件,尽管现在这似乎是一场傻瓜游戏。

标签: macos gcc osx-lion osx-mountain-lion osx-leopard


【解决方案1】:

来自Apple Developer Forum(需要帐号):

“编译器和链接器能够使用在旧操作系统版本上不起作用的功能和执行优化。-mmacosx-version-min 告诉工具您需要使用哪些操作系统版本,因此工具可以禁用那些不起作用的优化在这些操作系统版本上运行。如果您需要在较旧的操作系统版本上运行,则必须使用此标志。

-mmacosx-version-min 的缺点是应用程序在较新的操作系统版本上的性能可能会更差,如果它不需要向后兼容的话可能会更差。在大多数情况下,差异很小。”

【讨论】:

  • 放置此标志的位置在项目的构建设置中的“其他链接器标志”下,例如-mmacosx-version-min=10.10.
【解决方案2】:

“非法指令”消息只是告诉您,您的二进制文件包含您尝试运行它们的操作系统版本不理解的指令。我无法告诉您4 的确切含义,但我认为这是 Apple 内部的。

否则看看这些......它们有点旧,但可能会告诉你你需要知道什么

How does 64 bit code work on OS-X 10.5?
what does macosx-version-min imply?

【讨论】:

  • 谢谢;这两个问题和相关答案很有趣,我在提问之前阅读了它们,但我提出这个问题是因为两者都没有特别解决这个错误、它的原因以及为什么使用这个标志是一个解决方案。在我将它投入生产之前,我只是想确保我不会为另一组用户破坏某些东西,例如,我不清楚是否有任何副作用。
  • 我建议你不要担心,你是按照系统设计者的意图去做的。我今天遇到的编程风格元素有一句很好的引言......“试图超越编译器会破坏使用编译器的大部分目的”
  • @foundry 一个古老的引述,我似乎认为它甚至在你写的时候也是如此。我会同意,除非您为 iOCCC 编写代码! :) 但是是的,人们确实倾向于不想处理警告等。总是让我感到困惑的是,如果他们不想修复警告,为什么他们根本启用警告?如果它始终处于启用状态并且无法禁用它,那么修复红润的代码并完成它。否则忽略它。但是警告是开发人员的朋友。我在编译它的同一系统上看到了这条非法指令 4,但在 Linux(在那里编译)下它工作正常。
【解决方案3】:

我有意识地将这个答案写在一个老问题 with this 上,因为其他答案对我没有帮助。

我在编译它的同一系统上运行二进制文件时得到了Illegal Instruction: 4,所以-mmacosx-version-min 没有帮助。

我在 Mac OS X 10.11 的 Code Blocks 16 中使用 gcc。

但是,关闭所有代码块的编译器标志以进行优化是可行的。所以查看代码块设置的所有标志(右键单击项目->“构建属性”)并关闭所有您确定不需要的标志,特别是 -s-Oflags 进行优化.那是为我做的。

【讨论】:

  • 我的 CLI 应用程序在其原始目录中运行良好,但在移动时会出现此错误。必须是我的代码中的某些内容,提前退出应用程序并打印一个 hello world 工作正常。
  • 应该记住,优化器可以发现错误,并且通过禁用它们可以掩盖错误。当然有些代码真的不应该优化所以谁能说出来呢?但是,即使您最终认为不值得修复,如果您能找到错误的根源仍然会更好。
【解决方案4】:

我发现我的问题是不恰当的
if (leaf = NULL) {...}
应该在哪里
if (leaf == NULL){...}

检查那些编译器警告!

【讨论】:

  • 您知道= 运算符有时被戏称为什么吗? '`叶子是NULL吗?就是现在!'
【解决方案5】:

我在尝试使用 Xcode 10 构建时遇到此错误。这似乎是 Swift 编译器中的一个错误。使用Whole Module Optimization 构建,解决了问题:https://forums.swift.org/t/illegal-instruction-4-when-trying-to-compile-project/16118

这不是一个理想的解决方案,我会继续使用 Xcode 9.4.1 直到这个问题得到解决。

【讨论】:

    【解决方案6】:

    在我的情况下,我在重载时得到了这个

    ostream & operator << (ostream &out, const MyClass &obj)
    

    忘记返回out。在其他系统中这只会产生一个警告,但在 macos 上它也会产生一个错误(尽管它似乎打印正确)。

    通过添加正确的返回值解决了错误。在我的情况下,添加 -mmacosx-version-min 标志没有效果。

    【讨论】:

      【解决方案7】:

      我最近遇到了这个错误。我已经用 -O3 编译了二进制文件。谷歌告诉我这意味着“非法操作码”,这对我来说似乎很可疑。然后我关闭了所有优化并重新运行。现在错误转换为段错误。因此,通过设置 -g 并运行 valgrind 我跟踪了源并修复了它。重新启用所有优化后,没有进一步出现非法指令 4。

      显然,优化错误的代码会产生奇怪的结果。

      【讨论】:

        猜你喜欢
        • 2021-11-22
        • 2014-10-10
        • 1970-01-01
        • 1970-01-01
        • 2019-03-29
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 2023-03-14
        相关资源
        最近更新 更多