2012-03-12 2 views
5

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

Répondre

3

J'ai trouvé la solution!

J'ai fait un fichier dump de tout craché sur la console lors de l'appel make, et je remarquai que quelques appels à gcc ne contenaient pas l'option -march=armv4t.

J'ai remarqué que j'avais épelé le SBOX_EXTRA_COMPILER_FLAGS erroné.Il devrait être SBOX_EXTRA_COMPILER_ARGS. Avec cet ensemble, et CFLAGS mis à -march=armv4t Python construit maintenant avec succès et fonctionne sans instructions illégales. Merci Leo, de m'indiquer dans la bonne direction!

2

On dirait que vous créez un lien vers une bibliothèque qui est compilé pour une architecture supérieure à celle de l'appareil. Nous avons eu le même problème lors de la compilation avec CodeSourcery pour un périphérique avec un processeur ARMv4. Apparemment, les bibliothèques CodeSourcery ont été compilées pour ARMv5. Il pourrait s'agir de la bibliothèque à virgule flottante comme vous l'avez dit, ou d'une autre bibliothèque. Pouvez-vous trouver l'endroit dans le script de construction où le fichier en question est compilé et vérifier exactement quelles bibliothèques sont utilisées?

+0

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