web-dev-qa-db-fra.com

Qu'est-ce que l'erreur "Instruction illégale: 4" et pourquoi "-mmacosx-version-min = 10.x" corrige-t-il ce problème?

Je reçois des erreurs Illegal Instruction: 4 avec des fichiers binaires compilés avec GCC 4.7.2 sous Mac OS X 10.8.2 ("Mountain Lion") lorsque ces fichiers binaires sont exécutés sous Mac OS X 10.7.x ("Lion") et des versions antérieures. Les fichiers binaires fonctionnent correctement sous Mac OS X 10.8.x.

J'ai ajouté -mmacosx-version-min=10.5 à mes indicateurs de compilation, ce qui semble aider à résoudre le problème des clients 10.5.x, 10.6.x et 10.7.x, quel que soit le problème. 

Ce qui amène à ma (mes) question (s):

  • Quelle est l'erreur Illegal Instruction: 4?
  • Pourquoi -mmacosx-version-min=10.x corrige-t-il cette erreur spécifique sur 10.x et les clients supérieurs?

J'aimerais appliquer ce correctif à mes fichiers makefiles, mais j'aimerais savoir ce qu'il fait avant d'appuyer sur la gâchette. (Vais-je avoir des fichiers binaires plus volumineux? Ai-je toujours des fichiers binaires 64 bits? Existe-t-il des pièges avec cette approche dont je devrais avoir connaissance? Des effets secondaires non désirés? Etc.)

54
Alex Reynolds

À partir du Forum des développeurs Apple (compte requis):

"Le compilateur et l'éditeur de liens sont capables d'utiliser des fonctionnalités et d'effectuer des optimisations qui ne fonctionnent pas avec les versions antérieures du système d'exploitation. -mmacosx-version-min indique aux outils les versions de système d'exploitation que vous devez utiliser, de sorte qu'ils puissent désactiver les optimisations qui ne s'exécutent pas sur ces versions de système d'exploitation. .Si vous avez besoin d'exécuter sur des versions plus anciennes du système d'exploitation, vous devez utiliser cet indicateur.

"L'inconvénient de -mmacosx-version-min est que les performances de l'application peuvent être moins bonnes avec les nouvelles versions de système d'exploitation que si elle n'avait pas besoin d'être compatible avec les versions antérieures. Dans la plupart des cas, les différences sont minimes."

34
Alex Reynolds

Le message "Instruction illégale" indique simplement que vos fichiers binaires contiennent des instructions que la version du système d'exploitation sous laquelle vous essayez de les exécuter ne comprend pas. Je ne peux pas vous donner le sens exact de 4 mais je suppose que cela est interne à Apple.

Sinon, jetez un coup d'oeil à ceux-ci ... ils sont un peu vieux, mais vous disent probablement ce que vous devez savoir

Comment le code 64 bits fonctionne-t-il sur OS-X 10.5?
qu'implique macosx-version-min?

17
foundry

J'écris consciemment cette réponse à une vieille question avec ceci à l'esprit, car les autres réponses ne m'ont pas aidé.

J'ai eu le Illegal Instruction: 4 lors de l'exécution du binaire sur le même système que celui sur lequel je l'avais compilé, donc -mmacosx-version-min n'a pas aidé.

J'utilisais gcc dans les blocs de code 16 sous Mac OS X 10.11.

Cependant, désactiver tous les indicateurs du compilateur de Code Blocks pour l'optimisation fonctionnait. Examinez donc tous les drapeaux de codes définis (cliquez avec le bouton droit de la souris sur le projet -> "Propriétés de la construction") et désactivez tous les drapeaux dont vous n'êtes pas sûrs, notamment -s et les -O drapeaux d'optimisation. Cela l'a fait pour moi. 

3
krork

J'ai eu cette erreur en essayant de construire avec Xcode 10. Cela semble être un bogue dans le compilateur Swift. Construire avec Whole Module Optimization on résout le problème: https://forums.Swift.org/t/illegal-instruction-4-when-trying-to-compile-project/16118

Ce n'est pas une solution idéale, je continuerai à utiliser Xcode 9.4.1 jusqu'à ce que ce problème soit résolu.

1
Kyle Redfearn

Dans mon cas, j'ai eu ceci tout en surchargeant

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

et oublié de retourner out. Dans d’autres systèmes, cela génère simplement un avertissement, mais sous Macos, une erreur est également générée (bien que cela semble s’imprimer correctement).

L'erreur a été résolue en ajoutant la valeur de retour correcte. Dans mon cas, l'ajout de l'indicateur -mmacosx-version-min n'a eu aucun effet.

0
blue_note

J'ai récemment eu cette erreur. J'avais compilé le binaire avec -O3. Google m'a dit que cela signifie "opcode illégal", ce qui me semblait louche. J'ai ensuite désactivé toutes les optimisations et recommencer. Maintenant l'erreur s'est transformée en erreur de segmentation. Par conséquent, en définissant -g et en exécutant valgrind, j'ai suivi la source et l'ai corrigée. La réactivation de toutes les optimisations n'a révélé aucune autre instruction illégale 4.

Apparemment, l'optimisation d'un code erroné peut donner des résultats étranges.

0
Pascal Engeler