Qu'est-ce que l ' "Instruction illégale: 4" erreur et pourquoi "-mmacosx-version-min=10.x" fix it?

je reçois Illegal Instruction: 4 erreurs avec les fichiers binaires compilés avec GCC 4.7.2 sous Mac OS X 10.8.2 ("Montagne du Lion"), lorsque ces binaires sont sous Mac OS X 10.7.x ("Lion") et versions antérieures. Les binaires fonctionnent correctement sous Mac OS X 10.8.x.

j'ai ajouté -mmacosx-version-min=10.5 à mes options de compilation et cela semble aider à résoudre le problème pour 10.5.x, 10.6.x et 10.7.x clients, quel que soit le problème.

Qui arrive à ma question(s):

  • Qu'est-ce que l'erreur Illegal Instruction: 4 ?
  • pourquoi -mmacosx-version-min=10.x corrige-t-il cette erreur spécifique sur les clients 10.x et plus?

j'aimerais appliquer cette correction à mes makefiles, mais je voudrais savoir ce qu'elle fait avant d'appuyer sur la gâchette. (Est-ce que j'aurai des binaires plus grands? Est-ce que j'ai encore des binaires 64 bits? Sont-il des problèmes avec cette approche que je devrais connaître? Des effets secondaires involontaires? Etc.)

50
demandé sur Alex Reynolds 2013-01-11 03:04:12

6 réponses

De la Apple Developer Forum (compte):

" le compilateur et le linker sont capables d'utiliser des fonctionnalités et d'effectuer des optimisations qui ne fonctionnent pas sur les anciennes versions D'OS. -mmacosx-version-min indique aux outils les versions D'OS avec lesquelles vous devez travailler, afin que les outils puissent désactiver les optimisations qui ne fonctionneront pas sur ces versions D'OS. Si vous avez besoin d'exécuter sur des versions D'OS plus anciennes, vous devez utiliser ce drapeau.

"L'inconvénient -mmacosx-version-min , c'est que les performances de l'application peut être pire sur les nouvelles versions du système d'exploitation alors qu'il aurait pu être s'il n'a pas besoin d'être rétro-compatible. Dans la plupart des cas, les différences sont minimes."

31
répondu Alex Reynolds 2013-01-11 20:12:53

le message "instruction illégale" est simplement en train de vous dire que vos binaires contiennent des instructions.la version du système D'exploitation sous laquelle vous tentez de les exécuter ne comprend pas. Je ne peux pas vous donner le sens précis de 4 mais je pense que C'est interne à Apple.

sinon jetez un oeil à ceux-ci... ils sont un peu vieux, mais certainement vous dire ce que vous devez savoir

comment le code 64 bits fonctionne sur OS-X 10.5?

que signifie macosx-version-min?

15
répondu foundry 2017-05-23 11:46:24

j'écris consciemment cette réponse à une vieille question avec ce en tête, parce que les autres réponses ne m'ont pas aidé.

j'ai eu le Illegal Instruction: 4 en exécutant le binaire sur le même système que je l'avais compilé, donc -mmacosx-version-min n'a pas aidé.

j'utilisais gcc dans les blocs de Code 16 sur Mac OS X 10.11.

cependant, désactiver tous les indicateurs de compilateurs de blocs de Code pour l'optimisation a fonctionné. Alors regardez à tous les drapeaux les blocs de Code définis (clic droit sur le projet -> "construire des propriétés") et désactivez tous les drapeaux dont vous êtes sûr que vous n'avez pas besoin, en particulier les drapeaux -s et -O pour l'optimisation. Qu'il a fait pour moi.

3
répondu krork 2017-03-20 10:29:30

j'ai trouvé mon problème incorrect

if (leaf = NULL) {...}

où elle aurait dû être

if (leaf == NULL){...}

vérifiez ces avertissements de compilateur!

2
répondu Jaguilar 2017-07-07 04:29:50

j'ai récemment eu cette erreur. J'avais compilé le binaire avec-O3. Google m'a dit que cela signifie "opcode illégal", qui m'a semblé louche. J'ai ensuite éteint toutes les optimisations et rediffusé. Maintenant l'erreur se transforme en segfault. Par conséquent, en réglant-g et en exécutant valgrind, j'ai traqué la source et je l'ai corrigée. La réactivation de toutes les optimisations n'a montré aucune autre apparence d'instruction illégale 4.

apparemment, optimiser un mauvais code peut donner des résultats bizarres.

0
répondu Pascal Engeler 2018-02-16 13:44:46

j'ai eu cette erreur en essayant de construire avec Xcode 10. Il semble que ce soit un bug dans le compilateur Swift. Construire avec Whole Module Optimization sur, résout la question: https://forums.swift.org/t/illegal-instruction-4-when-trying-to-compile-project/16118

ce n'est pas une solution idéale pour les compilations de débogage car le temps de compilation est si long. Je continuerai d'utiliser Xcode 9.4.1 jusqu'à ce que cette question soit résolue.

0
répondu Kyle Redfearn 2018-10-05 20:25:53