Qual è l’errore “Istruzione non valida: 4” e perché “-mmacosx-version-min = 10.x” lo risolve?

Ricevo Illegal Instruction: 4 errori con binari compilati con GCC 4.7.2 in Mac OS X 10.8.2 (“Mountain Lion”), quando questi binari vengono eseguiti con Mac OS X 10.7.x (“Lion”) e versioni precedenti. I binari funzionano correttamente con Mac OS X 10.8.x.

Ho aggiunto -mmacosx-version-min=10.5 ai miei flag di compilazione e questo sembra aiutare a risolvere il problema per i client 10.5.x, 10.6.xe 10.7.x, qualunque sia il problema.

Quale arriva alla mia domanda (s):

  • Qual è l’ Illegal Instruction: 4 errore?
  • Perché -mmacosx-version-min=10.x risolve questo errore specifico su client 10.x maggiori?

Mi piacerebbe applicare questa correzione ai miei makefile, ma vorrei sapere cosa sta facendo prima di premere il grilletto. (Avrò binari più grandi? Ho ancora binari a 64 bit? Ci sono trucchi con questo approccio che dovrei sapere? Effetti collaterali indesiderati? Ecc.)

Dal forum degli sviluppatori Apple (account richiesto):

“Il compilatore e il linker sono in grado di utilizzare funzionalità ed eseguire ottimizzazioni che non funzionano su versioni del sistema operativo precedenti. -mmacosx-version-min indica agli strumenti quali versioni del sistema operativo è necessario utilizzare, così gli strumenti possono disabilitare le ottimizzazioni che non eseguire su quelle versioni del sistema operativo Se è necessario eseguire su versioni del sistema operativo precedenti, è necessario utilizzare questo flag.

“Lo svantaggio di -mmacosx-version-min è che le prestazioni della app potrebbero essere peggiori con le versioni del sistema operativo più recenti di quelle che avrebbe potuto essere se non fosse necessario essere retrocompatibili.” Nella maggior parte dei casi le differenze sono piccole. ”

Il messaggio “istruzione illegale” ti sta semplicemente dicendo che i tuoi binari contengono istruzioni, la versione del sistema operativo che stai tentando di eseguirli non comprende. Non posso darti il ​​significato preciso di 4 ma mi aspetto che sia interno ad Apple.

Altrimenti guarda questi … sono un po ‘vecchi, ma probabilmente ti diranno cosa devi sapere

Come funziona il codice a 64 bit su OS-X 10.5?
cosa implica macosx-version-min?

Sto scrivendo coscientemente questa risposta a una vecchia domanda con questo in mente, perché le altre risposte non mi hanno aiutato.

Ho ricevuto l’ Illegal Instruction: 4 mentre -mmacosx-version-min il binario sullo stesso sistema su cui l’avevo compilato, quindi -mmacosx-version-min non ha aiutato.

Stavo usando gcc in Code Blocks 16 su Mac OS X 10.11.

Tuttavia, distriggersndo tutti i flag del compilatore di Code Blocks per l’ottimizzazione ha funzionato. Quindi guarda tutti i set di codice Blocks (fai clic con il tasto destro del mouse su Project -> “Build Properties”) e spegni tutti i flag di cui non sei sicuro, specialmente -s e i flag -O per l’ottimizzazione. Che ha fatto per me.

Ho trovato il mio problema è stato un improprio
if (leaf = NULL) {...}
dove avrebbe dovuto essere
if (leaf == NULL){...}

Controlla gli avvisi del compilatore!

Recentemente ho ricevuto questo errore. Ho compilato il binario con -O3. Google mi ha detto che questo significa “codice operativo illegale”, che mi sembrava pericoloso. Ho quindi distriggersto tutte le ottimizzazioni e reran. Ora l’errore si è trasformato in un segfault. Quindi impostando -g ed eseguendo valgrind ho rintracciato l’origine e l’ho riparata. Riattualizzare tutte le ottimizzazioni non ha mostrato ulteriori aspetti dell’istruzione illegale 4.

Apparentemente, l’ottimizzazione del codice errato può produrre risultati strani.