Qué es la" Instrucción Ilegal: 4 "error y por qué lo hace" - mmacosx-version-min = 10.x " arreglarlo?


Obtengo Illegal Instruction: 4 errores con los 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 bajo Mac OS X 10.8.x.

Agregué -mmacosx-version-min=10.5 a mis indicadores de compilación y esto parece ayudar a resolver el problema para la versión 10.5.x, 10.6.x y 10.7.clientes x, sea cual sea el problema.

Que llega a mi(s) pregunta (s):

  • ¿Qué es el error Illegal Instruction: 4?
  • ¿por Qué -mmacosx-version-min=10.x solucionar este error específico en 10.x y más clientes?

Me gustaría aplicar esta corrección a mis makefiles, 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 trampas con este enfoque que debería saber? ¿Efectos secundarios no deseados? Sucesivamente.)

Author: Alex Reynolds, 2013-01-11

6 answers

Desde el Foro de Desarrolladores de Apple (se requiere cuenta):

"El compilador y el enlazador son capaces de usar características y realizar optimizaciones que no funcionan en versiones anteriores del sistema operativo. -mmacosx-version-min indica a las herramientas con qué versiones del sistema operativo necesita trabajar, para que las herramientas puedan deshabilitar las optimizaciones que no se ejecuten en esas versiones del sistema operativo. Si necesita ejecutar en versiones anteriores del sistema operativo, debe usar este indicador.

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

 31
Author: Alex Reynolds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-11 20:12:53

El mensaje "instrucción ilegal" simplemente le dice que sus binarios contienen instrucciones que la versión del sistema operativo bajo la que está intentando ejecutarlos no entiende. No puedo darle el significado preciso de 4 pero espero que sea interno de Apple.

De lo contrario, echa un vistazo a estos... son un poco viejos, pero probablemente le dirán lo que necesita saber

¿Cómo funciona el código de 64 bits en OS-X 10.5?
qué hace macosx-version-min ¿insinuar?

 15
Author: foundry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:46:24

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

Obtuve el 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 ayudó.

Estaba usando gcc en los bloques de código 16 en Mac OS X 10.11.

Sin embargo, desactivar todos los indicadores del compilador de Bloques de código para la optimización funcionó. Así que mira todos los bloques de código de banderas establecidos (haga clic con el botón derecho en el Proyecto - > " Build Properties") y desactive todos los indicadores que esté seguro de que no necesita, especialmente -s y los indicadores -Opara la optimización. Eso lo hizo por mí.

 3
Author: krork,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-20 10:29:30

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

Compruebe las advertencias del compilador!

 2
Author: Jaguilar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-07 04:29:50

Recientemente recibí este error. Había compilado el binario con-O3. Google me dijo que esto significa "opcode ilegal", lo que me pareció sospechoso. Luego apagué todas las optimizaciones y volví a analizar. Ahora el error se transformó en un segfault. Por lo tanto, al configurar-g y ejecutar valgrind rastreé la fuente y la arreglé. Reenabling all optimizations showed no further appearances of illegal instruction 4.

Aparentemente, optimizar el código incorrecto puede producir resultados extraños.

 0
Author: Pascal Engeler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-16 13:44:46

Recibí este error al intentar compilar con Xcode 10. Parece ser un error en el compilador Swift. Construyendo con Whole Module Optimization activado, resuelve el problema: https://forums.swift.org/t/illegal-instruction-4-when-trying-to-compile-project/16118

Esta no es una solución ideal para compilaciones de depuración ya que el tiempo para compilar es muy largo. Continuaré usando Xcode 9.4.1 hasta que se resuelva este problema.

 0
Author: Kyle Redfearn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-05 20:25:53