2012-03-12 9 views
5

मैं एआरएम 9 20 टी (आर्किटेक्चर 4 टी) के लिए पायथन 3.2 संकलित करने की कोशिश कर रहा हूं लेकिन मुझे कुछ अजीब त्रुटियां मिल रही हैं।पाइथन ऑन आर्म, अवैध निर्देश

मैं निम्नलिखित कंपाइलर का उपयोग करने के लिए कॉन्फ़िगर किए गए स्क्रैचबॉक्स वातावरण के अंदर पाइथन संकलित कर रहा हूं: "जीसीसी संस्करण 4.3.3 (सोर्सरी जी ++ लाइट 200 9 1-203)" जो एक बांह क्रॉस कंपाइलर है।

संकलन करते समय मैंने निम्नलिखित पर्यावरण चर में -march = armv4t आर्किटेक्चर ध्वज सेट करना सुनिश्चित किया है: CFLAGS, CPPFLAGS, SBOX_EXTRA_COMPILER_FLAGS।

यह स्क्रैचबॉक्स में ठीक संकलित करता है, और मैं स्क्रैचबॉक्स आर्म एमुलेटर के साथ पाइथन दुभाषिया चलाने में सक्षम हूं।

जब मैं इसे अपने एआरएम 9 20 टी में ले जाता हूं, तो मुझे पाइथन एक्सई चलाने के बाद एक अवैध निर्देश त्रुटि मिलती है।

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

और वापस ट्रेस की पहली कुछ पंक्तियों:

#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 कॉल

एक कोर डंप निम्नलिखित उत्पादन yeilds दो फ़्लोटिंग पॉइंट नंबर (डबल एड) जोड़ने के लिए लाइब्रेरी कॉल है।

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

मैं न वास्तव में क्यों इस कोड को चाहिए किसी भी त्रुटि के कारण:

मैं जो पश्व-अनुरेखन रिपोर्ट त्रुटि (longobject.c लाइन 2001) खड़ी कर रहा है अजगर कोड ऊपर देखा। मैंने एक छोटा सी ++ प्रोग्राम बनाने की कोशिश की जो उपरोक्त कोड में जैसे कई डबल्स को जोड़ा/घटाया/विभाजित किया गया, और यह डिवाइस पर ठीक चला गया।


किसी भी मदद की बहुत सराहना की जाएगी। केवल एक चीज जो मैं सोच सकता हूं वह यह है कि शायद गलत फ़्लोटिंग पॉइंट लाइब्रेरी को एक्सई में संकलित किया जा रहा है। जहां तक ​​मैं Google से बता सकता हूं, एआरएम 9 20 टी में हार्डवेयर फ़्लोटिंग पॉइंट समर्थन नहीं है।

एक अन्य कारण संरेखण त्रुटियों हो सकता है। पाइथन को -Wcast-align ध्वज के साथ संकलित करते समय, यह कुछ कास्टिंग चेतावनियों की रिपोर्ट करता है। एआरएम इसे पसंद नहीं करता है जब कुछ डेटा-प्रकार स्मृति में पते पर भी गठबंधन नहीं होते हैं।/proc/cpu/संरेखण हालांकि कुछ भी रिपोर्ट नहीं करता है।

पाठ की दीवार के लिए क्षमा करें, धन्यवाद आप इतनी दूर पढ़ने के लिए करता है, तो :)

उत्तर

3

मुझे समाधान मिला!

मैं make कॉल के दौरान कंसोल पर बाहर दे रहे थे सब कुछ की एक फ़ाइल-डंप बनाया है, और मैंने देखा है कि gcc करने के लिए कुछ कॉल -march=armv4t विकल्प नहीं था।

मैंने देखा कि मैंने SBOX_EXTRA_COMPILER_FLAGS गलत लिखा है।यह SBOX_EXTRA_COMPILER_ARGS होना चाहिए। उस सेट के साथ, और CFLAGS-march=armv4t पर सेट करें पाइथन अब सफलतापूर्वक अवैध निर्देशों के बिना बनाता है और चलाता है।

धन्यवाद लियो, मुझे सही दिशा में इंगित करने के लिए!

2

ऐसा लगता है कि आप कुछ पुस्तकालय है कि डिवाइस पर एक की तुलना में अधिक वास्तुकला के लिए संकलित किया गया है करने के लिए लिंक कर रहे हैं। एआरएमवी 4 सीपीयू वाले डिवाइस के लिए कोडसोर्सरी के साथ संकलन करते समय हमें एक ही समस्या थी। एपएमवी 5 के लिए कोड कोडकरी पुस्तकालयों को स्पष्ट रूप से संकलित किया गया था। यह फ़्लोटिंग पॉइंट लाइब्रेरी हो सकती है जैसे आपने कहा, या यह कुछ अन्य लाइब्रेरी हो सकती है। क्या आप बिल्ड-स्क्रिप्ट में जगह ढूंढ सकते हैं जहां प्रश्न में फ़ाइल संकलित की जा रही है और जांचें कि कौन सी लाइब्रेरी का उपयोग किया जाता है?

+0

बढ़िया! यह सही दिशा में है! मैं gnu डीबगर में एक डिस्सेप्लोर करने में कामयाब रहा, यह देखने के लिए कि वास्तव में अवैध निर्देश क्या था। यह पता चला है कि यह एक सीएलजेड निर्देश है, जिसे aeabi_ * कार्यों में निष्पादित किया जाता है। एआरएम दस्तावेज के अनुसार, सीएलजेड निर्देश एक एआरएम 5 और उपर्युक्त निर्देश है। यह त्रुटि बताता है। अब मुझे बस इतना करना है कि यह निर्देश कहां उत्पन्न हुआ है, जो थोड़ा और जटिल है। मैंने जांच की कि इस निर्देश में शामिल पुस्तकालयों में से कोई भी शामिल नहीं है। – Daniel

संबंधित मुद्दे