What is the "Illegal Instruction: 4" error and why does "-mmacosx-version-min=10.x" fix it?
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 -O
flags 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.
Related videos on Youtube
Alex Reynolds
Bioinformaticist, hobbyist iPhone developer, pug caregiver
Updated on July 08, 2022Comments
-
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 on10.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 over 11 yearsSnow Leopard is Mac OSX 10.6, please clarify/correct
-
rsp1984 about 10 yearsA 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 almost 4 yearsI 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 over 2 yearsI'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 over 2 yearsI'm sorry, I wish I could help!
- What is the
-
Alex Reynolds over 11 yearsThanks; 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 over 11 yearsI 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ță almost 8 yearsMy 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 about 7 yearsThe place to put this flag is under “Other Linker Flags” in the project’s build settings, e.g.
-mmacosx-version-min=10.10
. -
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 over 4 yearsYou know what that is jokingly called sometime, the
=
operator? '`Is leaf NULL? It is now!' -
Pryftan over 4 yearsIt 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.