Ich erhalte Illegal Instruction: 4
-Fehler bei mit GCC 4.7.2 kompilierten Binärdateien unter Mac OS X 10.8.2 ("Mountain Lion"), wenn diese Binärdateien unter Mac OS X 10.7.x ("Lion") und früheren Versionen ausgeführt werden. Die Binärdateien funktionieren ordnungsgemäß unter Mac OS X 10.8.x.
Ich habe -mmacosx-version-min=10.5
zu meinen Compile-Flags hinzugefügt. Dies scheint das Problem für 10.5.x-, 10.6.x- und 10.7.x-Clients zu lösen, egal was dieses Problem ist.
Was kommt auf meine Frage (n):
Illegal Instruction: 4
-Fehler?-mmacosx-version-min=10.x
diesen spezifischen Fehler auf 10.x
und größeren Clients?Ich möchte diesen Fix gerne auf meine Makefiles anwenden, möchte aber wissen, was er tut, bevor ich den Abzug betätige. (Habe ich größere Binärdateien? Habe ich immer noch 64-Bit-Binärdateien? Gibt es bei diesem Ansatz Probleme, die ich kennen sollte? Unbeabsichtigte Nebenwirkungen? Usw.)
Vom Apple Developer Forum (Konto erforderlich):
"Der Compiler und der Linker können Funktionen verwenden und Optimierungen durchführen, die bei älteren Betriebssystemversionen nicht funktionieren.
-mmacosx-version-min
teilt den Tools mit, mit welchen Betriebssystemversionen Sie arbeiten müssen, sodass die Tools Optimierungen deaktivieren können, die unter diesen Betriebssystemversionen nicht ausgeführt werden Wenn Sie ältere Betriebssystemversionen ausführen müssen, müssen Sie dieses Flag verwenden."Der Nachteil von
-mmacosx-version-min
ist, dass die Leistung der App unter neueren Betriebssystemversionen möglicherweise schlechter ist, als wenn sie nicht abwärtskompatibel sein müsste. In den meisten Fällen sind die Unterschiede gering."
Die Meldung "Illegale Anweisungen" sagt Ihnen einfach, dass Ihre Binärdateien Anweisungen enthalten, unter denen die Version des Betriebssystems, unter der Sie versuchen, sie auszuführen, nicht verstanden wird. Ich kann Ihnen nicht die genaue Bedeutung von 4
geben, aber ich gehe davon aus, dass dies intern von Apple ist.
Ansonsten sieh dir diese an ... sie sind ein bisschen alt, aber sie sagen dir wahrscheinlich, was du wissen musst
Wie funktioniert 64-Bit-Code unter OS-X 10.5?
was impliziert macosx-version-min?
Ich schreibe diese Antwort bewusst auf eine alte Frage in diesem Sinne , weil die anderen Antworten mir nicht geholfen haben.
Ich habe den Illegal Instruction: 4
bekommen, während ich die Binärdatei auf demselben System laufen ließ, auf dem ich es kompiliert hatte, also half -mmacosx-version-min
nicht.
Ich habe gcc in Code Blocks 16 unter Mac OS X 10.11 verwendet.
Das Deaktivieren aller Compilerflags von Code Blocks zur Optimierung funktionierte jedoch. Schauen Sie sich also alle Flags an, die durch Codeblöcke gesetzt wurden (klicken Sie mit der rechten Maustaste auf Projekt -> "Build-Eigenschaften"), und deaktivieren Sie alle Flags, die Sie nicht benötigen, insbesondere -s
und -O
flags zur Optimierung. Das hat es für mich getan.
Ich fand mein Problem unangemessenif (leaf = NULL) {...}
wo es hätte sein sollenif (leaf == NULL){...}
Überprüfen Sie diese Compiler-Warnungen!
Ich habe diesen Fehler erhalten, als ich versuchte, mit Xcode 10 zu bauen. Es scheint ein Fehler im Swift-Compiler zu sein. Beim Aufbau mit Whole Module Optimization
on wird das Problem behoben: https://forums.Swift.org/t/illegal-instruction-4-when-trying-to-compile-project/16118
Dies ist keine ideale Lösung. Ich werde Xcode 9.4.1 weiterhin verwenden, bis das Problem behoben ist.
In meinem Fall habe ich dies beim Überladen bekommen
ostream & operator << (ostream &out, const MyClass &obj)
und vergessen, out
zurückzugeben. In anderen Systemen wird lediglich eine Warnung generiert, auf Mac OS wird jedoch auch ein Fehler generiert (obwohl der Ausdruck korrekt zu sein scheint).
Der Fehler wurde behoben, indem der richtige Rückgabewert hinzugefügt wurde. In meinem Fall hatte das Hinzufügen des Flags -mmacosx-version-min
keine Auswirkung.
Ich habe kürzlich diesen Fehler erhalten. Ich hatte die Binärdatei mit -O3 kompiliert. Google sagte mir, dass dies "illegaler Opcode" bedeutet, was mir faul erschien. Ich habe dann alle Optimierungen abgeschaltet und erneut gelesen. Nun wurde der Fehler in einen Segfault umgewandelt. Durch das Setzen von -g und das Ausführen von valgrind konnte ich die Quelle aufspüren und beheben. Das erneute Aktivieren aller Optimierungen zeigte keine weiteren Anzeichen von illegalen Anweisungen 4.
Offensichtlich kann die Optimierung von falschem Code zu seltsamen Ergebnissen führen.