J'essaye de compiler Python 3.2 pour un ARM920T (architecture 4T) mais je reçois quelques erreurs étranges.Python sur bras, instructions illégales
Je compile Python dans un environnement Scratchbox, configuré pour utiliser le compilateur suivant: "gcc version 4.3.3 (Sourcery G ++ Lite 2009q1-203)" qui est un compilateur croisé. Lors de la compilation, je me suis assuré de définir l'indicateur d'architecture -march = armv4t, dans les variables d'environnement suivantes: CFLAGS, CPPFLAGS, SBOX_EXTRA_COMPILER_FLAGS.
Il compile bien dans la boîte à gratter, et je suis capable d'exécuter l'interpréteur python avec l'émulateur de bras de la boîte à scratch.
Cependant, lorsque je le déplace vers mon ARM920T, j'obtiens une erreur d'instruction illégale immédiatement après l'exécution de l'exécutable python.
Une décharge de base yeilds la sortie suivante:
Program terminated with signal 4, Illegal instruction.
#0 0x00138810 in __aeabi_dadd()
Et les premières lignes de l'arrière-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
Pour autant que je suis en mesure de la recherche, l'appel __aeabi_dadd est un appel de bibliothèque pour l'ajout de deux nombres à virgule flottante (Double Add).
Je regardé le code python que les rapports de l'backtrace est à l'origine d'erreur (ligne 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;
}
Je ne vois pas vraiment pourquoi ce code devrait provoquer des erreurs. J'ai essayé de faire un petit programme en C++ qui ajoutait/soustrait/divisait e.t.c beaucoup de doubles, comme dans le code ci-dessus, et ça fonctionnait bien sur l'appareil.
Toute aide serait grandement appréciée. Les seules choses que je peux penser est que peut-être la mauvaise bibliothèque à virgule flottante est compilé dans l'exe. L'ARM920T ne dispose pas de support matériel à virgule flottante pour autant que je puisse dire de Google.
Une autre cause pourrait être des erreurs d'alignement. Lors de la compilation de Python avec l'indicateur -Wcast-align, il signale quelques avertissements de diffusion. L'ARM ne l'aime pas lorsque certains types de données ne sont pas alignés sur des adresses paires en mémoire./proc/cpu/alignment ne rapporte rien cependant.
Désolé pour le mur de texte, merci si vous lisez loin :)
Génial! C'est dans la bonne direction! J'ai réussi à faire un désassemblage dans le débogueur gnu, pour voir ce que c'était exactement l'instruction illégale. Il s'avère que c'est une instruction CLZ, qui est exécutée dans les fonctions aeabi_ *. Selon les documentations ARM, l'instruction CLZ est une instruction ARM5 et supérieure. Cela explique l'erreur. Maintenant, tout ce que je dois faire est de suivre où cette instruction est générée, ce qui est un peu plus compliqué. J'ai vérifié qu'aucune des bibliothèques connectées ne contenait cette instruction. – Daniel