2008-10-14 33 views
10

के आकार को कम करने की प्रक्रिया मैं एआरएम प्रोसेसर पर चलाने के लिए हेक्स फ़ाइल का उत्पादन कर रहा हूं जिसे मैं 32 के नीचे रखना चाहता हूं। यह वर्तमान में उससे बहुत बड़ा है और मुझे आश्चर्य हुआ कि अगर किसी को इस बारे में कुछ सलाह हो सकती है कि इसे कम करने के लिए सबसे अच्छा तरीका क्या है?निष्पादन योग्य

यहाँ मैं अब तक क्या किया है

  1. तो मैं 'आकार' चलाते हैं पर यह निर्धारित करने के लिए कितना बड़ा हेक्स फ़ाइल है।
  2. फिर 'आकार' फिर से देखने के लिए कि प्रत्येक वस्तु फ़ाइलों में से प्रत्येक हेक्स फ़ाइलों को बनाने के लिए लिंक कितना बड़ा है। ऐसा लगता है कि अधिकांश आकार बाहरी पुस्तकालयों से आता है।
  3. फिर मैंने यह देखने के लिए 'रीडल्फ' का उपयोग किया कि कौन से फ़ंक्शंस सबसे अधिक मेमोरी लेते हैं।
  4. मैंने कोड के माध्यम से यह देखने के लिए खोज की कि क्या मैं उन कार्यों को कॉल कर सकता हूं।

यहां जहां मैं अटक गया हूं, कुछ ऐसे कार्य हैं जिन्हें मैं सीधे कॉल नहीं करता (उदाहरण के लिए _vfprintf) और मुझे यह नहीं मिल रहा है कि मैं क्या कहूं ताकि मैं कॉल को हटा सकूं (जैसा कि मुझे लगता है कि मुझे आवश्यकता नहीं है यह)।

तो अगले चरण क्या हैं?

आपकी सहायता के लिए धन्यवाद। उत्तर देने के लिए

प्रतिक्रिया:

  • मैं वहाँ कार्यों बुलाया जा रहा है जो स्मृति का एक बहुत ऊपर ले रहे हैं देख सकते हैं। हालांकि मैं यह नहीं कह सकता कि इसे क्या कह रहा है।
  • मैं उन कार्यों को छोड़ना चाहता हूं (यदि संभव हो) लेकिन मुझे वह नहीं मिल रहा है जो उन्हें बुला रहा है !! मुझे लगता है कि लाइब्रेरी कार्यों की किसी भी संख्या से बुलाया जा सकता है।
  • लिंकर वांछित के रूप में काम कर रहा है, मुझे लगता है कि इसमें केवल प्रासंगिक लाइब्रेरी फ़ाइलें शामिल हैं। आप कैसे जानते हैं कि केवल प्रासंगिक कार्यों को शामिल किया जा रहा है? क्या आप इसके लिए ध्वज या कुछ सेट कर सकते हैं?
  • मैं जीसीसी
+0

शायद आप इसे पहले से ही जानते हैं, शायद यह मदद की है: http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html – Matthias

उत्तर

11

जनरल सूची:

  • सुनिश्चित करें कि आप सभी आकार के विकल्प के साथ संकलक और लिंकर डिबग विकल्प अक्षम
  • संकलित करें और लिंक है कि बनाने पर (जीसीसी में -Os) पर
  • भागो strip दिया निष्पादन योग्य
  • एक नक्शा फ़ाइल जेनरेट करें और अपने फ़ंक्शन आकार की जांच करें। आप या तो अपने लिंकर को अपनी नक्शा फ़ाइल (-M) उत्पन्न करने के लिए प्राप्त कर सकते हैं, या आप अंतिम निष्पादन योग्य पर objdump का उपयोग कर सकते हैं (ध्यान दें कि यह केवल एक अप्रचलित निष्पादन योग्य पर काम करेगा!) यह वास्तव में समस्या को ठीक नहीं करेगा, लेकिन यह आपको सबसे बुरे अपराधियों के बारे में बताएगा।
  • nm का उपयोग अपने प्रत्येक ऑब्जेक्ट फ़ाइलों से कॉल किए गए प्रतीकों की जांच के लिए करें। इससे यह पता लगाने में मदद मिलनी चाहिए कि किस कॉलिंग फ़ंक्शंस को आप कॉल नहीं करना चाहते हैं।

मूल प्रश्न में केवल प्रासंगिक कार्यों को शामिल करने के बारे में एक उप-प्रश्न था। gcc में उपयोग की जाने वाली प्रत्येक ऑब्जेक्ट फ़ाइल के भीतर सभी फ़ंक्शंस शामिल होंगे। इसे एक और तरीका रखने के लिए, यदि आपके पास कोई ऑब्जेक्ट फ़ाइल है जिसमें 10 फ़ंक्शंस हैं, तो सभी 10 फ़ंक्शंस आपके निष्पादन योग्य में शामिल किए गए हैं, भले ही एक 1 को वास्तव में बुलाया जाए।

मानक पुस्तकालय (उदाहरण के लिए libc) फ़ंक्शंस को कई अलग ऑब्जेक्ट फ़ाइलों में विभाजित करेगा, जिन्हें तब संग्रहीत किया जाता है। निष्पादन योग्य तब संग्रह के खिलाफ जुड़ा हुआ है। कई ऑब्जेक्ट फ़ाइलों में विभाजित करके लिंकर केवल उन कार्यों को शामिल करने में सक्षम है जिन्हें वास्तव में कहा जाता है। (यह मानता है कि आप स्थिर रूप से लिंक कर रहे हैं)

कोई कारण नहीं है कि आप एक ही चाल नहीं कर सकते हैं। बेशक, आप तर्क दे सकते हैं कि यदि कार्यों को नहीं कहा जाता है तो आप शायद उन्हें स्वयं हटा सकते हैं।

यदि आप अन्य पुस्तकालयों के खिलाफ स्थाई रूप से लिंक कर रहे हैं तो आप यह भी सुनिश्चित करने के लिए ऊपर दिए गए टूल चला सकते हैं कि वे समान नियमों का पालन कर रहे हैं।

+1

यदि आप प्रतीकों की जांच करने जा रहे हैं तो आप डीबग विकल्पों के साथ संकलन करना चाहते हैं और exe को अलग नहीं करना चाहते हैं। – Tarski

+1

मैं भी थंबम्ब के साथ झुकाव का सुझाव दूंगा, चूंकि अंगूठे के निष्पादक आमतौर पर हाथों से छोटे होते हैं। – strager

-1

उपयोग कर रहा हूँ आप executable compression की तरह कुछ को देखो सकता है।

+0

इससे मदद नहीं मिलेगी अगर _running_ प्रोग्राम को नहीं माना जाता है 32k से अधिक हो। –

+0

यह होगा कि यह एक समय में केवल 32k डिकंप्रेस्ड होगा। – TraumaPony

+0

या कोड को रोम-सक्षम होना चाहिए। –

2

भविष्य के संदर्भ के लिए बस दोबारा जांच और दस्तावेज करने के लिए, लेकिन क्या आप थंब निर्देशों का उपयोग करते हैं? वे सामान्य निर्देशों के 16 बिट संस्करण हैं। कभी-कभी आपको 2 16 बिट निर्देशों की आवश्यकता हो सकती है, इसलिए यह कोड स्थान में 50% को सहेज नहीं पाएगा।

एक सभ्य लिंकर को केवल आवश्यक कार्यों को लेना चाहिए। हालांकि, आपको व्यक्तिगत लिंकिंग के लिए फ़ंक्शंस पैकेज करने के लिए कंपाइलर & लिंक सेटिंग्स की आवश्यकता हो सकती है।

+0

धन्यवाद, थंब सामान के बारे में सोचा नहीं था। ईमानदार होने के लिए मुझे नहीं पता कि इसका उपयोग किया जा रहा है, मुझे ऐसा लगता है लेकिन आगे की जांच करेगा। हां लिंकर केवल उपयोग किए गए कार्यों को जोड़ता है, मुझे पूरा यकीन है। लेकिन मैं सिर्फ काम नहीं कर रहा हूं कि काम क्या कर रहा है? मुझे एक मानचित्र की तरह चाहिए जो कॉल कर सकता है? – Richard

1

ठीक है तो अंत में मैंने प्रोजेक्ट को अपने सबसे सरल रूप में कम कर दिया, फिर धीरे-धीरे फ़ाइलों को एक-एक करके जोड़ा, जब तक कि मैं इसे हटाना नहीं चाहता था, जिसे 'readelf' फ़ाइल में दिखाई देना था। तब जब मेरे पास फ़ाइल थी तो मैंने सबकुछ बाहर टिप्पणी की और धीरे-धीरे चीजों को तब तक जोड़ दिया जब तक कि फ़ंक्शन फिर से पॉप नहीं हुआ। तो अंत में मैंने पाया कि इसे किसने बुलाया और उन सभी कॉल को हटा दिया ... अब यह वांछित काम करता है ... मीठा!

हालांकि ऐसा करने का एक बेहतर तरीका होना चाहिए।

5

एक और अनुकूलन जो आपको काम बचा सकता है -फंक्शन-सेक्शन, -ब्लूएल, - जीसी-सेक्शन, मानते हैं कि आप जीसीसी का उपयोग कर रहे हैं। एक अच्छा टूलचेन को यह बताने की आवश्यकता नहीं होगी कि, हालांकि।

स्पष्टीकरण: जीएनयू एलडी लिंक अनुभाग, और जीसीसी प्रति अनुवाद इकाई में एक खंड उत्सर्जित करता है जबतक कि आप इसे अन्यथा नहीं बताते। लेकिन सी ++ में, निर्भरता ग्राफ में नोड ऑब्जेक्ट्स और फ़ंक्शंस हैं।

2

गहरी एम्बेडेड परियोजनाओं पर मैं हमेशा किसी भी मानक लाइब्रेरी फ़ंक्शंस का उपयोग करने से बचने का प्रयास करता हूं। यहां तक ​​कि "स्ट्रेटोल()" जैसे साधारण कार्य बाइनरी आकार को उड़ाते हैं। यदि संभव हो तो बस उन कॉल से बचें।

सबसे गहरी एम्बेडेड परियोजनाओं में आपको बहुमुखी "printf()" या गतिशील स्मृति आवंटन की आवश्यकता नहीं है (कई नियंत्रकों के पास 32kb या कम रैम है)।

केवल "printf()" का उपयोग करने के बजाय मैं एक बहुत ही सरल कस्टम "printf()" का उपयोग करता हूं, यह फ़ंक्शन केवल हेक्साडेसिमल या दशमलव प्रारूप में संख्याओं को प्रिंट नहीं कर सकता है। संकलन समय पर अधिकांश डेटा संरचनाओं को आवंटित किया जाता है।

1

एंड्रयू एज कॉम्बे की एक अच्छी सूची है, लेकिन यदि आप वास्तव में हर अंतिम बाइट को स्क्रैप करना चाहते हैं, तो sstrip एक अच्छा टूल है जो सूची से गायब है और कुछ और केबी को बंद कर सकता है।

उदाहरण के लिए, strip पर चलाएं, it can shave off ~2kB

एक पुराने README (this अप्रत्यक्ष स्रोत फ़ाइल के शीर्ष पर टिप्पणी देखें) से:

sstrip एक छोटे उपयोगिता है कि उस का हिस्सा नहीं हैं एक ELF फ़ाइल के अंत में सामग्री को दूर करता है कार्यक्रम की स्मृति छवि।

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

ध्यान दें कि कुछ जानकारी जो इसे हटाती है, के कारण कुछ sstrip'd निष्पादन योग्य rumoured to have issues कुछ उपकरणों के साथ है। स्रोत की टिप्पणियों में इस पर अधिक चर्चा की गई है।

इसके अलावा ... सबसे कम संभव निष्पादन योग्य बनाने के लिए एक मनोरंजक/पागल पढ़ने के लिए, this article पढ़ने योग्य है।

0

इस विशिष्ट जरूरत का जवाब करने के लिए:

• मैं उन कार्यों (यदि संभव हो) को छोड़ देना चाहते हैं, लेकिन मैं क्या उन्हें बुला है नहीं मिल सकता है !! किसी भी लाइब्रेरी फ़ंक्शंस I अनुमान से कॉल किया जा सकता है।

आप अपने कोड बेस का विश्लेषण करने के कौन क्या, किसके द्वारा दिए गए समारोह बुलाया जा रहा है और यह कि तरह बातें, वहाँ SciTools द्वारा प्रदान की बाहर वहाँ "समझे सी" कहा जाता है के लिए एक महान उपकरण है कॉल देखना चाहते हैं।

https://scitools.com/

मैं इसे इस्तेमाल किया है बहुत बार अतीत में स्थिर कोड विश्लेषण करने के लिए। यह वास्तव में पुस्तकालय निर्भरता पेड़ निर्धारित करने में मदद कर सकता है। यह अन्य चीजों के साथ कॉलिंग पेड़ को आसानी से ऊपर और नीचे ब्राउज़ करने की अनुमति देता है।

वे सीमित समय मूल्यांकन प्रदान करते हैं, तो आपको एक लाइसेंस खरीदना होगा।

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