2012-03-12 12 views
5

Sto cercando di compilare Python 3.2 per un ARM920T (architettura 4T) ma sto ricevendo alcuni strani errori.Python on Arm, Istruzioni illegali

Sto compilando Python in un ambiente Scratchbox, configurato per utilizzare il seguente compilatore: "gcc versione 4.3.3 (Sourcery G ++ Lite 2009q1-203)" che è un compilatore a croce braccio.

Durante la compilazione, mi sono assicurato di impostare il flag di architettura -march = armv4t nelle seguenti variabili di ambiente: CFLAGS, CPPFLAGS, SBOX_EXTRA_COMPILER_FLAGS.

Compilano bene in scratchbox e sono in grado di eseguire l'interprete python con l'emulatore di braccio scratchbox.

Quando lo spostamento sul mio ARM920T tuttavia, ottengo immediatamente un errore di istruzione non valida dopo aver eseguito python exe.

Un core dump yeilds il seguente output:

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

E le prime righe del back-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 

per quanto ho potuto per la ricerca, la chiamata __aeabi_dadd è una chiamata alla libreria per l'aggiunta di due numeri in virgola mobile (Double Add).

ho guardato il codice Python che i rapporti backtrace causa l'errore (linea di 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; 
      } 

io veramente non vedo il motivo per cui questo codice dovrebbe causare gli eventuali errori. Ho provato a creare un piccolo programma C++ che ha aggiunto/sottratto/diviso e.t.c un sacco di doppi, come nel codice sopra, e ha funzionato bene sul dispositivo.


Qualsiasi aiuto sarebbe molto apprezzato. L'unica cosa che posso pensare è che forse la libreria di virgola mobile sbagliata viene compilata nell'exe. L'ARM920T non ha il supporto hardware in virgola mobile per quanto posso dire da Google.

Un'altra causa potrebbe essere l'errore di allineamento. Durante la compilazione di Python con il flag -Wcast-align, segnala alcuni avvisi di trasmissione. All'ARM non piace quando determinati tipi di dati non sono allineati a indirizzi pari in memoria./proc/cpu/alignment non riporta alcunché.

Ci scusiamo per il muro di testo, grazie se avete letto fino a questo punto :)

risposta

3

Ho trovato la soluzione!

Ho effettuato un file-dump di tutto quello che è emerso sulla console durante la chiamata make e ho notato che alcune chiamate a gcc non contenevano l'opzione -march=armv4t.

Ho notato che avevo digitato il SBOX_EXTRA_COMPILER_FLAGS sbagliato.Dovrebbe essere SBOX_EXTRA_COMPILER_ARGS. Con questo set, e CFLAGS impostato su -march=armv4t Python ora viene creato e eseguito correttamente senza istruzioni illegali.

Grazie Leo, per avermi indicato nella giusta direzione!

2

Sembra che ci si collega a qualche libreria che è compilato per un'architettura superiore a quello del dispositivo. Abbiamo avuto lo stesso problema durante la compilazione con CodeSourcery per un dispositivo con una CPU ARMv4. Apparentemente le librerie CodeSourcery sono state compilate per ARMv5. Potrebbe essere la libreria a virgola mobile come hai detto tu, o potrebbe essere un'altra libreria. Riesci a trovare il posto nello script di compilazione in cui il file in questione è stato compilato e controllare esattamente quali librerie sono utilizzate?

+0

Ottimo! Questo è nella giusta direzione! Sono riuscito a fare un disassemblaggio nel debugger di gnu, per vedere quale fosse esattamente l'istruzione illegale. Si scopre che si tratta di un'istruzione CLZ, che viene eseguita nelle funzioni aeabi_ *. Secondo le documentazioni ARM, l'istruzione CLZ è un'istruzione ARM5 e sopra. Questo spiega l'errore. Ora tutto quello che devo fare è rintracciare dove viene generata questa istruzione, che è un po 'più complicata. Ho verificato che nessuna delle librerie collegate contiene questa istruzione. – Daniel