मैं एआरएम 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/संरेखण हालांकि कुछ भी रिपोर्ट नहीं करता है।
पाठ की दीवार के लिए क्षमा करें, धन्यवाद आप इतनी दूर पढ़ने के लिए करता है, तो :)
बढ़िया! यह सही दिशा में है! मैं gnu डीबगर में एक डिस्सेप्लोर करने में कामयाब रहा, यह देखने के लिए कि वास्तव में अवैध निर्देश क्या था। यह पता चला है कि यह एक सीएलजेड निर्देश है, जिसे aeabi_ * कार्यों में निष्पादित किया जाता है। एआरएम दस्तावेज के अनुसार, सीएलजेड निर्देश एक एआरएम 5 और उपर्युक्त निर्देश है। यह त्रुटि बताता है। अब मुझे बस इतना करना है कि यह निर्देश कहां उत्पन्न हुआ है, जो थोड़ा और जटिल है। मैंने जांच की कि इस निर्देश में शामिल पुस्तकालयों में से कोई भी शामिल नहीं है। – Daniel