sierra - ¿Cuál es el error "Instrucción ilegal: 4" y por qué "-mmacosx-versión-min=10.x" lo arregla?
mountain lion dmg (5)
Desde el Apple Developer Forum (se requiere una cuenta):
"El compilador 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".
Recibo Illegal Instruction: 4
errores con binarios compilados 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 compilació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 en10.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.)
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?
Encontré que mi problema era incorrecto
if (leaf = NULL) {...}
donde debería haber estado
if (leaf == NULL){...}
¡Mira esas advertencias del compilador!
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 compilado, 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 compilador 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 compilació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í.
Recientemente recibí este error. Yo había compilado 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.