2011-12-17 13 views
5

जब मैं एक नहीं सेशन कार्यक्रम संकलित:जीसीसी लक्ष्य EXE कोड आकार को कम करना?

  • जीसीसी (LLVM के समान परिणाम के रूप में अच्छी तरह से):

    int main(void) 
    { 
        return 0; 
    } 
    
    विभिन्न compilers के साथ

    10 KiB निष्पादन योग्य (-s साथ संकलित) दी

    • सेक्शन: .CRT, .bss, .data, .idata, .rdata, .text, .tls

    • msvcrt.dll और kernel32.dll

  • MSVC 2010 को निर्भर करता है: .data, .rdata: एक 5.5 किबा निष्पादन योग्य (/MD /Ox साथ संकलित)

    • धारा दिया , .reloc, .text

    • msvcr100.dll और kernel32.dll

    • पर निर्भर करता है और आगे के साथ .rdata मर्ज करके कम हो गई है सका .text

  • विंडोज ड्राइवर किट 7.1: एक 6.5 किबा निष्पादन योग्य (/MD /Ox साथ संकलित, msvcrt_winxp.obj के साथ जुड़ा हुआ दी इसे XP पर चलाने की अनुमति देने के लिए)

    • सेक्शन: .data, .rdata, .text

    • msvcrt.dll और kernel32.dll

    • पर निर्भर करता है और आगे .text

  • Windows 2003 ड्राइवर डेवलपमेंट किट के साथ विलय .rdata से कम हो गई है सका: दी 3.5 KiB निष्पादन योग्य

    • सेक्शन: .data, .rdata, .text

    • msvcrt.dll

    • पर निर्भर करता है और आगे .text

  • टिनी सी संकलक (TCC) के साथ .rdata मर्ज करके कम हो गई है सका: दी एक 1।5 किबा निष्पादन

    • सेक्शन: .data, .text

    • msvcrt.dll

पर निर्भर करता है तो मुझे लगता है कि सवाल सरल है:

आगे करने के लिए क्या यह संभव है जीसीसी या एलएलवीएम के लक्ष्य निष्पादन योग्य आकार को कम करें ताकि वे msvcrt.dll से लिंक करते समय, न्यूनतम-न्यूनतम संभव के करीब हों?

(संपादित करें: मैं स्पष्ट रूप से, आदि UPX तरह पैकर की तलाश नहीं कर रहा हूँ)

+0

क्या आप समझा सकते हैं कि आप क्यों पूछ रहे हैं? क्या आप अक्सर इस तरह के एक छोटे से कार्यक्रम संकलित करते हैं? अच्छी तरह से यथार्थवादी कार्यक्रमों को संकलित करने के लिए एक कंपाइलर के लिए यह अधिक महत्वपूर्ण नहीं है ?? (उनमें से ज्यादातर बहुत बड़ा हैं)! –

+0

http://stackoverflow.com/questions/1413171/what-is-strip-gcc-plication-used-for, http://embeddedfreak.wordpress.com/2009/02/10/removing-unused-functionsdead-codes -with-gccgnu-ld/ – Ulterior

+0

@Ulterior: '-s' विकल्प 'स्ट्रिप' जैसा ही है। अन्य विकल्पों में भी मदद नहीं मिली। – Mehrdad

उत्तर

2

यह करने के लिए एक विशेष रूप से सार्थक बात नहीं है। कुछ चीजों को खत्म करना संभव हो सकता है, लेकिन जैसे ही आपके पास ऐसा प्रोग्राम है जो वास्तव में कुछ भी करता है, तो यह उन चीज़ों को सीधे वापस खींच देगा।

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

सामान्य में, अगर आप इस प्रोग्राम आकार को कम -Os साथ संकलन, और -fltoया-fwhole-program इस्तेमाल करने की कोशिश करना चाहते हैं (लेकिन यह पिछले अपने निर्माण प्रक्रिया के लिए अनेक परिवर्तन की आवश्यकता होगी)। साथ ही, -g का उपयोग न करें, और अंतिम बाइनरी को पट्टी करें (यदि वह उन्हें तोड़ नहीं देता है)।

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