¿Cuál es el error “Instrucción ilegal: 4” y por qué “-mmacosx-versión-min = 10.x” lo arregla?

Recibo Illegal Instruction: 4 errores con binarios comstackdos con GCC 4.7.2 bajo Mac OS X 10.8.2 (“Mountain Lion”), cuando esos binarios se ejecutan bajo Mac OS X 10.7.x (“Lion”) y versiones anteriores. Los binarios funcionan correctamente en Mac OS X 10.8.x.

-mmacosx-version-min=10.5 a mis banderas de comstackción y esto parece ayudar a resolver el problema para los clientes 10.5.x, 10.6.x y 10.7.x, cualquiera que sea el problema.

Que obtiene mi pregunta (s):

  • ¿Cuál es la Illegal Instruction: 4 error?
  • ¿Por qué -mmacosx-version-min=10.x soluciona este error específico en 10.x y clientes mayores?

Me gustaría aplicar esta corrección a mis archivos make, pero me gustaría saber qué está haciendo antes de apretar el gatillo. (¿Tendré binarios más grandes? ¿Todavía tengo binarios de 64 bits? ¿Hay problemas con este enfoque que debería conocer? ¿Efectos secundarios no deseados? Etc.)

Desde el Apple Developer Forum (se requiere una cuenta):

“El comstackdor y el enlazador son capaces de utilizar funciones y realizar optimizaciones que no funcionan en versiones anteriores del sistema operativo. -mmacosx-version-min le dice a las herramientas con qué versiones de sistema operativo necesita trabajar, para que las herramientas puedan deshabilitar las optimizaciones que no ejecutar en esas versiones del sistema operativo. Si necesita ejecutar en versiones anteriores del sistema operativo, entonces debe usar este indicador.

“La desventaja de -mmacosx-version-min es que el rendimiento de la aplicación puede ser peor en las versiones de sistema operativo más nuevas que podría haber sido si no fuera compatible con versiones anteriores. En la mayoría de los casos, las diferencias son pequeñas”.

El mensaje de “instrucción ilegal” simplemente le dice que sus binarios contienen instrucciones que la versión del sistema operativo que está tratando de ejecutar no lo comprende. No puedo darle el significado preciso de 4 pero espero que sea interno a Apple.

De lo contrario, eche un vistazo a estos … son un poco viejos, pero probablemente le diga lo que necesita saber

¿Cómo funciona el código de 64 bits en OS-X 10.5?
¿Qué implica macosx-versión-min?

Estoy escribiendo conscientemente esta respuesta a una vieja pregunta con esto en mente, porque las otras respuestas no me ayudaron.

Obtuve la Illegal Instruction: 4 mientras ejecutaba el binario en el mismo sistema en el que lo había comstackdo, por lo que -mmacosx-version-min no me ayudó.

Estaba usando gcc en Code Blocks 16 en Mac OS X 10.11.

Sin embargo, desactivar todos los indicadores del comstackdor de Code Blocks para la optimización funcionó. Por lo tanto, observe todos los indicadores Bloques de código establecidos (haga clic con el botón derecho en Proyecto -> “Propiedades de comstackción”) y apague todos los indicadores que esté seguro de que no necesita, especialmente -s y -O indicadores para la optimización. Eso lo hizo por mí.

Encontré que mi problema era incorrecto
if (leaf = NULL) {...}
donde debería haber estado
if (leaf == NULL){...}

¡Mira esas advertencias del comstackdor!

Recientemente recibí este error. Yo había comstackdo el binario con -O3. Google me dijo que esto significa “código de operación ilegal”, que me pareció sospechoso. Luego apagué todas las optimizaciones y reran. Ahora el error se transformó en segfault. Por lo tanto, al configurar -g y ejecutar valgrind rastreé el origen y lo solucioné. Repetir todas las optimizaciones no mostró más aspectos de instrucción ilegal 4.

Aparentemente, la optimización del código incorrecto puede producir resultados extraños.