it-swarm.com.de

Was ist der Fehler "Illegal Instruction: 4" und warum behebt "-mmacosx-version-min = 10.x" dies?

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):

  • Was ist der Illegal Instruction: 4-Fehler?
  • Warum behebt -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.)

54
Alex Reynolds

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."

34
Alex Reynolds

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?

17
foundry

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 -Oflags zur Optimierung. Das hat es für mich getan. 

3
krork

Ich fand mein Problem unangemessen
if (leaf = NULL) {...}
wo es hätte sein sollen
if (leaf == NULL){...}

Überprüfen Sie diese Compiler-Warnungen!

2
Jaguilar

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.

1
Kyle Redfearn

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.

0
blue_note

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.

0
Pascal Engeler