मैं एक लिनक्स कर्नेल zImage को डीकंप्रेस करने से पहले डीडीबी का उपयोग करने की कोशिश कर रहा हूं। कर्नेल एआरएम लक्ष्य पर चल रहा है और मेरे पास एक जीडीबी सर्वर स्टब के साथ एक जेएबी डीबगर जुड़ा हुआ है। लक्ष्य को बूट लोडर लोड करना है। बूट लोडर कर्नेल छवि को फ्लैश से पढ़ता है और इसे 0x20008000
पर रैम में रखता है, फिर उस स्थान पर शाखाएं।डीबग लिनक्स कर्नेल प्री-डिकंप्रेशन चरण
मैं GDB शुरू कर दिया और दूरदराज के लक्ष्य से कनेक्ट किया है, तो मैं तो जैसे GDB के add-symbol-file
आदेश का उपयोग करें:
add-symbol-file arch/arm/boot/compressed/vmlinux 0x20008000 -readnow
जब मैं उस पते के लिए एक ब्रेकपाइंट सेट, यह सही जगह पर जाल है - सही जब यह कर्नेल के लिए शाखाओं। हालांकि, जीडीबी arch/arm/boot/compressed/head.S
के स्रोत से गलत रेखा दिखाता है। यह पीछे 4 लाइनें है। मैं इसे कैसे ठीक करूं?
मैं भी -s .start 0x20008000
साथ add-symbol-file
करने के लिए -s section addr
विकल्प जोड़ने की कोशिश की है; यह वास्तव में एक ही समस्या में परिणाम।
पहले सुनिश्चित करें कि आपके पास एक gcc और gdb है जो संगत हैं, अधिमानतः उसी टूलचेन संस्करण से। साथ ही, पता है कि लिनक्स कर्नेल को -O2 के साथ संकलित किया गया है, इसलिए कुछ पंक्तियां अनुकूलित हो जाती हैं। क्या आप वाकई कहीं भी .align कीवर्ड नहीं हैं? –
डिकंप्रेसर कोड सभी पीसी रिश्तेदार है। यह खुद को एक क्षेत्र से दूसरे क्षेत्र में भी कॉपी कर सकता है। बूट लोडर इसे डाल सकता है जहां डिकंप्रेस्ड लक्ष्य है; इसलिए इसे खुद को स्थानांतरित करना है। मुझे संदेह है कि आप निश्चित प्रतीकों के साथ JTAG का उपयोग करके अच्छे समय प्राप्त करने जा रहे हैं। मुझे नहीं पता कि क्या आप किसी भी तरह जीडीबी के साथ * स्थानांतरित कर सकते हैं। –