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í :)
¡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