2012-03-12 22 views
5

Bir ARM920T (mimari 4T) için Python 3.2'yi derlemeye çalışıyorum ama bazı garip hatalar alıyorum. Python'u, aşağıdaki derleyiciyi kullanacak şekilde yapılandırılmış bir Scratchbox ortamı içinde derledim: "gcc sürüm 4.3.3 (Sourcery G ++ Lite 2009q1-203)", bir çapraz çapraz derleyici.Kol Üzerinde Python, Yasadışı Talimatlar

Derleme sırasında aşağıdaki ortam değişkenlerinde -march = armv4t mimari bayrağını ayarladığınızdan emin oldum: CFLAGS, CPPFLAGS, SBOX_EXTRA_COMPILER_FLAGS.

Kazı kazan kutusuna ince bir derleme yapar ve python yorumlayıcısını çizikli kol emülatörü ile çalıştırabiliyorum.

Ancak, ARM920T aygıtıma taşıdığım zaman, python exe'yi çalıştırdıktan hemen sonra Yasa Dışı Talimat hatası alıyorum.

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

ve arka iz ilk birkaç satır: Bildiğim kadarıyla araştırma mümkün olmuştur olarak

#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 

, __aeabi_dadd çağrıyı

bir çekirdek dökümü şu çıktıyı yeilds iki kayan noktalı sayı eklemek için bir kütüphane çağrısıdır (Double Add).

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; 
      } 

bu kod hataları neden gerektiğini Gerçekten neden görmüyoruz:

Ben backtrace raporları hatası (longobject.c hattını 2001) neden olan piton kodunu kaldırdı. Yukarıdaki kodda olduğu gibi, çok fazla sayıda iki katına eklenmiş/çıkarılmış/ikiye bölünmüş küçük bir C++ programı yapmayı denedim ve aygıtta iyi çalıştı.


Herhangi bir yardım çok takdir edilecektir. Düşünebildiğim tek şey, belki de yanlış kayan nokta kütüphanesinin exe içine derlenmesidir. ARM920T, Google'dan söyleyebileceğim kadarıyla donanımsal kayan nokta desteği içermiyor.

Başka bir neden hizalama hataları olabilir. Python'u -Wcast-align bayrağıyla derlerken, birkaç döküm uyarısı bildirir. Belirli veri türleri bellekte adreslerde bile hizalanmadığında ARM bunu sevmez./proc/cpu/alignment ancak bir şey bildirmez. Metnin duvarına için üzgünüm

teşekkürler bu kadar okursanız :) Cihazda olandan daha yüksek bir mimari için derlenmiş bazı kütüphaneye bağlantı veriyor gibi geliyor

cevap

3

Çözümü buldum!

Ben make Görüşme sırasında konsolda spewed her şeyin bir dosya dökümü yapılmış ve ben gcc için birkaç çağrılar -march=armv4t seçeneği içermiyordu fark ettim.

SBOX_EXTRA_COMPILER_FLAGS yanlış yazıldığını fark ettim.SBOX_EXTRA_COMPILER_ARGS olmalıdır. Bu setle-march=armv4t Python'a ayarlandığında, artık yasadışı talimatlar olmadan başarılı bir şekilde çalışır ve çalışır.

Teşekkürler Leo, bana doğru yönde işaret ettiğin için!

2

. Bir ARMv4 CPU ile bir cihaz için CodeSourcery ile derlerken aynı sorun vardı. CodeSourcery kütüphaneleri ARMv5 için derlenmiştir. Söylediğiniz gibi kayan nokta kütüphanesi olabilir veya başka bir kütüphane olabilir. Söz konusu dosyanın derlenmiş olduğu ve tam olarak hangi kitaplıkların kullanıldığını kontrol ettiğin yapı-senaryodaki yeri bulabilir misin?

+0

Harika! Bu doğru yönde! Tam olarak yasadışı talimatın ne olduğunu görmek için gnu hata ayıklayıcısında bir sökme yapmayı başardım. Aeabi_ * işlevlerinde yürütülen bir CLZ komutu olduğu ortaya çıkıyor. ARM belgelerine göre, CLZ talimatı bir ARM5 ve yukarıdaki talimattır. Bu, hatayı açıklıyor. Şimdi tek yapmam gereken, bu komutun üretildiği yeri bulmaktır, ki bu biraz daha karmaşıktır. Bağlantılı olan kütüphanelerin hiçbirinin bu talimatı içermediğini kontrol ettim. – Daniel