What is the "Illegal Instruction: 4" error and why does "-mmacosx-version-min=10.x" fix it?

170,738

Solution 1

From the Apple Developer Forum (account required):

"The compiler and linker are capable of using features and performing optimizations that do not work on older OS versions. -mmacosx-version-min tells the tools what OS versions you need to work with, so the tools can disable optimizations that won't run on those OS versions. If you need to run on older OS versions then you must use this flag.

"The downside to -mmacosx-version-min is that the app's performance may be worse on newer OS versions then it could have been if it did not need to be backwards-compatible. In most cases the differences are small."

Solution 2

The "illegal instruction" message is simply telling you that your binaries contain instructions the version of the OS that you are attempting to run them under does not understand. I can't give you the precise meaning of 4 but I expect that is internal to Apple.

Otherwise take a look at these... they are a little old, but probably tell you what you need to know

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

Solution 3

I'm consciously writing this answer to an old question with this in mind, because the other answers didn't help me.

I got the Illegal Instruction: 4 while running the binary on the same system I had compiled it on, so -mmacosx-version-min didn't help.

I was using gcc in Code Blocks 16 on Mac OS X 10.11.

However, turning off all of Code Blocks' compiler flags for optimization worked. So look at all the flags Code Blocks set (right-click on the Project -> "Build Properties") and turn off all the flags you are sure you don't need, especially -s and the -Oflags for optimization. That did it for me.

Solution 4

I found my issue was an improper
if (leaf = NULL) {...}
where it should have been
if (leaf == NULL){...}

Check those compiler warnings!

Solution 5

I got this error when attempting to build with Xcode 10. It appears to be a bug in the Swift compiler. Building with Whole Module Optimization on, resolves the issue: https://forums.swift.org/t/illegal-instruction-4-when-trying-to-compile-project/16118

This is not an ideal solution, I will continue to use Xcode 9.4.1 until this issue is resolved.

Share:
170,738

Related videos on Youtube

Alex Reynolds
Author by

Alex Reynolds

Bioinformaticist, hobbyist iPhone developer, pug caregiver

Updated on July 08, 2022

Comments

  • Alex Reynolds
    Alex Reynolds almost 2 years

    I get Illegal Instruction: 4 errors with binaries compiled with GCC 4.7.2 under Mac OS X 10.8.2 ("Mountain Lion"), when those binaries are run under Mac OS X 10.7.x ("Lion") and earlier versions. The binaries work properly under Mac OS X 10.8.x.

    I added -mmacosx-version-min=10.5 to my compile flags and this seems to help resolve the issue for 10.5.x, 10.6.x and 10.7.x clients, whatever that issue is.

    Which gets to my question(s):

    • What is the Illegal Instruction: 4 error?
    • Why does -mmacosx-version-min=10.x fix this specific error on 10.x and greater clients?

    I'd like to apply this fix to my makefiles, but would like to know what it is doing before I pull the trigger. (Will I have larger binaries? Do I still have 64-bit binaries? Are there gotchas with this approach I should know about? Unintended side-effects? Etc.)

    • foundry
      foundry over 11 years
      Snow Leopard is Mac OSX 10.6, please clarify/correct
    • rsp1984
      rsp1984 about 10 years
      A missing return value may cause an "Illegal Instruction: 4". I ran into this yesterday. Paying attention to my compiler warnings brought me on the right track.
    • Alex Reynolds
      Alex Reynolds almost 4 years
      I asked this question seven years ago and would be unable to help you today, sorry. I do recall trying to distribute binaries for older versions of Mac OS X, though that seems like a fools game these days.
    • dstromberg
      dstromberg over 2 years
      I'm getting this error too, and so far none of the suggestions here helped. I policed-up my compiler warnings (they're totally gone now), tried -mmacosx-version-min (it was an unrecognized option), tried both clang and gcc (same result), and tried compiling without -O. It's not "just" the program I'm compiling either: Outlook for MacOS has the same problem. Any further suggestions?
    • Alex Reynolds
      Alex Reynolds over 2 years
      I'm sorry, I wish I could help!
  • Alex Reynolds
    Alex Reynolds over 11 years
    Thanks; those two questions and associated answers are interesting, and I read them before asking, but I ask this question because neither particularly addressed this error, its cause and why the use of this flag is a solution. Before I put this into production, I just want to make sure that I'm not breaking something for another set of users, say, and it's unclear to me if there are any side effects.
  • foundry
    foundry over 11 years
    I would suggest that you shouldn't worry, you are going with the intention of the system designers. There's a nice quote from Elements of Programming Style I came across today... "Trying to outsmart a compiler defeats much of the purpose of using one"
  • Cristi Băluță
    Cristi Băluță almost 8 years
    My CLI app works fine in it's original directory but when moved it gives this error. Must be something in my code, exiting the app early and printing a hello world works fine.
  • Demitri
    Demitri about 7 years
    The place to put this flag is under “Other Linker Flags” in the project’s build settings, e.g. -mmacosx-version-min=10.10.
  • Pryftan
    Pryftan over 4 years
    @foundry An old quote and I seem to think it was even when you wrote that. I would agree except when you're writing code for the iOCCC! :) But yes people do tend to not want to deal with warnings etc. What always baffles me is if they don't want to fix a warning why do they have warnings enabled at all? If it's one that is always enabled and there's no way to disable it then fix the ruddy code and be done with it. Or else ignore it. But warnings are a developer's friend. I've seen this illegal instruction 4 on the same system it's compiled on but under Linux (compiled there) it works fine.
  • Pryftan
    Pryftan over 4 years
    You know what that is jokingly called sometime, the = operator? '`Is leaf NULL? It is now!'
  • Pryftan
    Pryftan over 4 years
    It should be remembered though that optimisers can find bugs and by disabling them you can be masking a bug. Of course some code really shouldn't be optimised so who can tell? But still it would be better if you could find the source of the bug even if you decide that it's not worth it in the end to fix.