2012-03-12 15 views
5

Estoy tratando de compilar Python 3.2 para un ARM920T (arquitectura 4T) pero estoy recibiendo algunos errores extraños.Python en el brazo, instrucciones ilegales

Estoy compilando Python dentro de un entorno Scratchbox, configurado para usar el siguiente compilador: "gcc versión 4.3.3 (Sourcery G ++ Lite 2009q1-203)" que es un compilador cruzado de brazo.

Al compilar, me he asegurado de establecer el indicador de arquitectura -march = armv4t, en las siguientes variables de entorno: CFLAGS, CPPFLAGS, SBOX_EXTRA_COMPILER_FLAGS.

Compila bien en scratchbox, y puedo ejecutar el intérprete de python con el emulador de brazo de scratchbox.

Cuando lo muevo a mi ARM920T, sin embargo, recibo un error de Instrucción ilegal inmediatamente después de ejecutar el exe de python.

un volcado de memoria yeilds el siguiente resultado:

Program terminated with signal 4, Illegal instruction. 
#0 0x00138810 in __aeabi_dadd() 

Y las primeras líneas de la parte posterior-trace:

#0 0x00138810 in __aeabi_dadd() 
#1 0x001134f4 in PyLong_FromString (str=0x402de300 "3644798167", pend=0x0, base=10) at Objects/longobject.c:2001 
#2 0x00132478 in parsenumber (s=<value optimized out>, c=<value optimized out>) at Python/ast.c:3189 
#3 ast_for_atom (n=<value optimized out>, c=<value optimized out>) at Python/ast.c:1396 
#4 ast_for_power (n=<value optimized out>, c=<value optimized out>) at Python/ast.c:1726 
#5 ast_for_expr (c=0xbeaf7f50, n=0x402f5b78) at Python/ast.c:191 

Por lo que yo he sido capaz de investigar, la llamada __aeabi_dadd es una llamada de biblioteca para agregar dos números de coma flotante (Doble adición).

busqué el código Python, que los informes backtrace está causando el error (línea longobject.c 2001):

if (log_base_BASE[base] == 0.0) { 
      twodigits convmax = base; 
      int i = 1; 

      log_base_BASE[base] = (log((double)base)/  // Line 2001 
            log((double)PyLong_BASE)); 
      for (;;) { 
       twodigits next = convmax * base; 
       if (next > PyLong_BASE) 
        break; 
       convmax = next; 
       ++i; 
      } 

Realmente no veo por qué este código debe causar ningún error. Intenté hacer un pequeño programa en C++ que sumara/restara/dividiera e.t.c un montón de dobles, como en el código anterior, y funcionó bien en el dispositivo.


Cualquier ayuda sería muy apreciada. Lo único que se me ocurre es que tal vez la biblioteca de coma flotante incorrecta se está compilando en el exe. El ARM920T no tiene soporte de punto flotante de hardware por lo que pude decir de Google.

Otra causa podría ser errores de alineación. Al compilar Python con el indicador -Wcast-Align, informa algunas advertencias de conversión. Al ARM no le gusta cuando ciertos tipos de datos no están alineados en direcciones pares en la memoria./proc/cpu/alignment no informa nada sin embargo.

Lo siento por el muro de texto, gracias si leyeron hasta aquí :)

Respuesta

3

¡Encontré la solución!

Hice un volcado de archivos de todo lo que vomitó en la consola durante la llamada make, y noté que algunas llamadas a gcc no contenían la opción -march=armv4t.

Me di cuenta de que había escrito mal el SBOX_EXTRA_COMPILER_FLAGS.Debe ser SBOX_EXTRA_COMPILER_ARGS. Con ese conjunto, y CFLAGS establecido en -march=armv4t, Python ahora se construye y ejecuta correctamente sin instrucciones ilegales.

Gracias Leo, por apuntarme en la dirección correcta!

2

Suena como que está vinculando a alguna biblioteca que se compila para una arquitectura más alto que el que está en el dispositivo. Tuvimos el mismo problema al compilar con CodeSourcery para un dispositivo con una CPU ARMv4. Aparentemente, las bibliotecas de CodeSourcery se compilaron para ARMv5. Puede ser la biblioteca de punto flotante como dijiste, o podría ser alguna otra biblioteca. ¿Puedes encontrar el lugar en el script de construcción donde se está compilando el archivo en cuestión y verificar exactamente qué bibliotecas se utilizan?

+0

¡Genial! ¡Esto está en la dirección correcta! Logré hacer un desmontaje en el depurador de gnu, para ver cuál era exactamente la instrucción ilegal. Resulta que es una instrucción CLZ, que se ejecuta en las funciones aeabi_ *. De acuerdo con la documentación de ARM, la instrucción CLZ es una instrucción ARM5 y superior. Eso explica el error. Ahora todo lo que necesito hacer es rastrear dónde se genera esta instrucción, que es un poco más complicada. Comprobé que ninguna de las bibliotecas vinculadas contiene esta instrucción. – Daniel

Cuestiones relacionadas