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