2012-01-12 10 views
5

के प्रवेश बिंदु निर्धारित मैं एक एम्बेडेड सिस्टम (mipsel) मेरी 86 लिनक्स पर के लिए एक crosscompiling toolchain है। मैं इसके लिए एक कस्टम कर्नेल (की छवि "vmlinux" कहते हैं) का निर्माण करने के लिए कैसे और के माध्यम सेलोड का पता और छीन लिनक्स कर्नेल छवि

objcopy -S -O binary vmlinux vmlinux.bin 

आगे की प्रक्रिया के लिए मैं भी लोड का पता और छवि के प्रवेश बिंदु की जरूरत है कि छवि पट्टी करने के लिए कैसे पता है। से पहले अलग करना यह scripts/mksysmap या, और अधिक स्पष्ट रूप से के माध्यम से उन्हें निर्धारित करने के लिए कोई समस्या नहीं है, के माध्यम से

nm -n vmlinux | grep -v '\([aNUw] \)\|\(__crc_\)\|\(\$[adt]\)' > System.map 

तो मैं लोड का पता और के माध्यम से

awk '/A _text/ { print "0x"$1; }' < _System.map 
awk '/T kernel_entry/ { print "0x"$1; }' < System.map 

प्रवेश बिंदु अब चुनौती यह है कि कभी कभी है निर्धारित कर सकते हैं मैं अपने आप को द्वारा कर्नेल का निर्माण नहीं है, लेकिन पहले से बने गिरी के बाद यह पहले से ही objcopy के माध्यम से अपने प्रतीकों में से छीन कर दिया गया है मिलता है। क्या कोई मुझे बता सकता है कि यह कैसे करें? मैं कर्नेल बिल्डिंग और टूलचेन उपयोग में बहुत कुशल नहीं हूं। दोनों एनएम और objdump, छीन छवि पसंद नहीं है

vmlinux.bin: File format not recognized 

उत्तर

1

से कह objcopy manual page

objcopy द्विआधारी का उत्पादन लक्ष्य जैसे का उपयोग कर (द्वारा एक कच्चे बाइनरी फ़ाइल उत्पन्न करने के लिए इस्तेमाल किया जा सकता, का उपयोग -O द्विआधारी)। जब objcopy एक कच्चे बाइनरी फ़ाइल उत्पन्न करता है, यह अनिवार्य रूप से इनपुट वस्तु फ़ाइल की सामग्री की स्मृति डंप का उत्पादन करेगा। सभी प्रतीकों और स्थानांतरण जानकारी को त्याग दिया जाएगा। मेमोरी डंप आउटपुट फ़ाइल में कॉपी किए गए निम्नतम अनुभाग के आभासी पते पर शुरू होगा।

यहाँ एक उदाहरण है कि PowerPC आर्किटेक्चर पर इस्तेमाल किया जा सकता है: फ़ाइल

मूल vmlinux

bash-3.2$ file vmlinux 
vmlinux: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), statically linked, not stripped 

छीन vmlinux एक "डाटा" माना जाता है

bash-3.2$ file vmlinux.bin 
vmlinux.bin: data 

Powe के लिए ELF प्रारूप करने के लिए परिवर्तित बाइनरी vmlinux की RPC

bash-3.2$ powerpc-440fp-linux-objcopy -I binary vmlinux.bin -B powerpc -O elf32-powerpc vmlinux.bin.x 

उत्पादन अब एक ELF फ़ाइल माना जाता है

bash-3.2$ file vmlinux.bin.x 
vmlinux.bin.x: ELF 32-bit MSB relocatable, PowerPC or cisco 4500, version 1 (SYSV), not stripped 

आप मैं, -B और -O पैरामीटर गुजरना होगा। आप इस पैरामीटर को अपने objcopy दस्तावेज से प्राप्त कर सकते हैं।

लेकिन चूंकि आपकी बाइनरी पहले से ही छेड़छाड़ करने की कोशिश कर रही है, इसलिए यह संभव नहीं है क्योंकि सेक्शन जानकारी उपलब्ध नहीं है। फ़ाइल में मौजूद सभी डेटा को .data secion में डाला जाएगा।

+0

कि उत्तर के लिए विलम्बित धन्यवाद।दुर्भाग्यवश मुझे ई-मेल के माध्यम से उत्तर के बारे में अधिसूचित नहीं किया गया, क्षमा करें। असल में मैं लोड पता और प्रवेश बिंदु खोजने के लिए एक और तरीका ढूंढने में कामयाब रहा, लेकिन मेरा समाधान स्थिति के लिए विशिष्ट था और आम तौर पर लागू नहीं किया जा सकता है, इसलिए मैं इसे यहां उद्धृत नहीं कर रहा हूं। मुझे बस इतना कहना है कि आपका प्रस्तावित समाधान ईएलएफ फ़ाइल बनाता है, लेकिन फ़ाइल में वांछित स्थानान्तरण जानकारी नहीं है। इस प्रकार, जानकारी को एनएम-एन' के माध्यम से निकाला नहीं जा सकता है। वैसे भी जवाब देने के लिए धन्यवाद। – kriegaex

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