سؤال

test.c:

int main()
{
    return 0;
}

لم أستخدم أي علامات (أنا مبتدئ في دول مجلس التعاون الخليجي)، فقط الأمر:

gcc test.c

لقد استخدمت الأحدث بناء TDM لدول مجلس التعاون الخليجي على win32.يبلغ حجم الملف القابل للتنفيذ الناتج 23 كيلو بايت تقريبًا، وهو كبير جدًا بالنسبة لبرنامج فارغ.

كيف يمكنني تقليل حجم الملف القابل للتنفيذ؟

هل كانت مفيدة؟

المحلول

لا تتبع اقتراحاتها، ولكن من أجل التسلية، اقرأ هذه القصة' حول صنع أصغر الثنائي قزم ممكن.

نصائح أخرى

كيف يمكنني تقليل حجمها؟

  • لا تفعل ذلك. أنت مجرد إضاعة وقتك.
  • استخدام العلم إلى رموز الشريط (GCC -S)

افتراضيا بعض المكتبات القياسية (مثل وقت التشغيل C) المرتبط بتنفيذك. تحقق من المفاتيح --nostdlib --nostartfiles --nodefaultlib للتفاصيل. خيارات الارتباط الموصوفة هنا.

بالنسبة للبرنامج الحقيقي الخيار الثاني هو محاولة خيارات التحسين, ، على سبيل المثال، (تحسين للحجم).

يستسلم. على X86 Linux، فإن GCC 4.3.2 ينتج ثانيا 5K. لكن انتظر! هذا مع الارتباط الديناميكي! ال ثابت ثنائي مرتبط أكثر من نصف ميغ: 516k. الاسترخاء وتعلم العيش مع النفاية.

وقالوا إن Modula-3 لن تذهب إلى أي مكان بسبب 200K Hello World Binary!


في حال كنت تتساءل عما يحدث، يتم تنظيم مكتبة GNU C مثل تضمين ميزات معينة سواء كان برنامجك يعتمد عليها أم لا. تشمل هذه الميزات هذه التوافه مثل malloc وحرة، dlopen، بعض معالجة السلسلة، وكلها bucketload. من الأشياء التي يبدو أن القيام به مع اللغات والتدويل، على الرغم من أنني لا أستطيع العثور على أي صفحات رجالية ذات صلة.

إنشاء ملفات تنفيذية صغيرة للبرامج التي تتطلب الحد الأدنى من الخدمات ليس هدف التصميم ل glibc. أن تكون عادلا، كما كان ليس هدف التصميم لكل نظام وقت التشغيل لقد عملت مع (حوالي نصف دزينة).

في الواقع، إذا كانت التعليمات البرمجية الخاصة بك لا تفعل شيئًا، فهل من العدل أن يستمر المترجم في إنشاء ملف قابل للتنفيذ؟؛-)

حسنًا، في نظام التشغيل Windows، سيظل حجم أي ملف قابل للتنفيذ، على الرغم من أنه قد يكون صغيرًا إلى حد معقول.مع نظام MS-DOS القديم، سيكون تطبيق عدم القيام بأي شيء كاملًا مجرد بضع بايت.(أعتقد أن هناك أربع بايتات لاستخدام المقاطعة 21 ساعة لإغلاق البرنامج.) ثم مرة أخرى، تم تحميل هذه التطبيقات مباشرة في الذاكرة.عندما أصبح تنسيق EXE أكثر شيوعًا، تغيرت الأمور قليلاً.تحتوي الملفات التنفيذية الآن على معلومات إضافية حول العملية نفسها، مثل نقل التعليمات البرمجية وأجزاء البيانات بالإضافة إلى بعض المجاميع الاختبارية ومعلومات الإصدار.أضافت مقدمة Windows رأسًا آخر إلى التنسيق، لإخبار MS-DOS بأنه لا يمكنه تنفيذ الملف القابل للتنفيذ نظرًا لأنه يحتاج إلى التشغيل ضمن Windows.وسوف يتعرف عليه Windows دون مشاكل.وبطبيعة الحال، تم أيضًا توسيع التنسيق القابل للتنفيذ بمعلومات الموارد، مثل الصور النقطية والأيقونات ونماذج الحوار وغير ذلك الكثير.

يتراوح حجم الملف القابل للتنفيذ الذي لا يمكن تنفيذه في الوقت الحاضر بين 4 و8 كيلو بايت، اعتمادًا على المترجم الخاص بك وكل طريقة استخدمتها لتقليل حجمه.سيكون بحجم حيث يؤدي UPX في الواقع إلى ملفات تنفيذية أكبر!قد تتم إضافة وحدات بايت إضافية في الملف القابل للتنفيذ لأنك أضفت مكتبات معينة إلى التعليمات البرمجية الخاصة بك.ستضيف المكتبات التي تحتوي على بيانات أو موارد تمت تهيئتها قدرًا كبيرًا من البايتات.تؤدي إضافة معلومات التصحيح أيضًا إلى زيادة حجم الملف القابل للتنفيذ.

ولكن في حين أن كل هذا يمثل تمرينًا جيدًا لتقليل الحجم، فقد تتساءل عما إذا كان من العملي الاستمرار في القلق بشأن تضخم التطبيقات.تقوم الأقراص الصلبة الحديثة بتقسيم الملفات إلى أجزاء، وبالنسبة للأقراص الكبيرة جدًا، سيكون الفرق صغيرًا جدًا.ومع ذلك، فإن مقدار المتاعب التي قد يتطلبها الحفاظ على الحجم صغيرًا قدر الإمكان سيؤدي إلى إبطاء سرعة التطوير، إلا إذا كنت مطورًا خبيرًا معتادًا على هذه التحسينات.لا تميل هذه الأنواع من التحسينات إلى تحسين الأداء، وبالنظر إلى متوسط ​​مساحة القرص لمعظم الأنظمة، لا أرى سببًا لكونها عملية.(ما زلت أقوم بتحسين الكود الخاص بي بطرق مماثلة ولكن مرة أخرى، لدي خبرة في هذه التحسينات.)


مهتم في رأس EXE؟يبدأ بالأحرف MZ لـ "Mark Zbikowski".الجزء الأول هو رأس MS-DOS ذو النمط القديم للملفات التنفيذية ويستخدم ككعب روتين لـ MS-DOS قائلاً أن البرنامج لا MS-DOS قابل للتنفيذ.(في الملف الثنائي، يمكنك العثور على النص "لا يمكن تشغيل هذا البرنامج في وضع DOS." وهو كل ما يفعله بشكل أساسي:عرض تلك الرسالة.التالي هو رأس PE، الذي سيتعرف عليه Windows ويستخدمه بدلاً من رأس MS-DOS.يبدأ بالحروف PE للتنفيذ المحمول.بعد هذا الرأس الثاني، سيكون هناك الملف القابل للتنفيذ نفسه، مقسمًا إلى عدة كتل من التعليمات البرمجية والبيانات.يحتوي الرأس على جداول إعادة تخصيص خاصة تخبر نظام التشغيل بمكان تحميل كتلة معينة.وإذا تمكنت من إبقاء هذا ضمن الحد الأقصى، فيمكن أن يكون الملف النهائي القابل للتنفيذ أصغر من 4 كيلو بايت، ولكن 90% منه سيكون عبارة عن معلومات رأسية بدون وظائف.

أنا أحب طريقة الأسئلة الشائعة DJGPP موجهة هذا منذ عدة سنوات:

بشكل عام، تحكيم أحجام التعليمات البرمجية من خلال النظر إلى حجم برامج "Hello" لا معنى لها، لأن هذه البرامج تتكون في معظمها من رمز بدء التشغيل. ... معظم قوة كل هذه الميزات تضيء في برامج "مرحبا". لا توجد نقطة في تشغيل كل هذا الرمز فقط لطباعة سلسلة 15 بايت والخروج.

ما هو الغرض من هذا التمرين؟

حتى مع انخفاض لغة المستوى ك C، لا يزال هناك الكثير من الإعداد الذي يجب أن يحدث قبل أن يتم استدعاؤه الرئيسي. يتم التعامل مع بعض هذا الإعداد بواسطة Loader (الذي يحتاج إلى معلومات معينة)، يتم التعامل مع بعضها بواسطة التعليمات البرمجية التي تستدعي الرئيسية. وبعد ذلك ربما هناك القليل من رمز المكتبة الذي يجب أن يكون هناك أي برنامج عادي. على الأقل، من المحتمل أن تكون هناك مراجع إلى المكتبات القياسية، إذا كانت في DLLs.

فحص الحجم الثنائي للبرنامج الفارغ هو تمرين لا قيمة له في حد ذاته. لا يخبرك شيئا. إذا كنت ترغب في تعلم شيء ما حول حجم التعليمات البرمجية، فحاول كتابة برامج غير فارغة (ويفضل غير فارغة). مقارنة البرامج التي تستخدم المكتبات القياسية مع البرامج التي تفعل كل شيء أنفسهم.

إذا كنت ترغب حقا في معرفة ما يحدث في تلك الثنائية (ولماذا يكون كبيرا جدا)، فاكتشف التنسيق القابل للتنفيذ احصل على أداة تفريغ ثنائية وتأخذ الشيء بعيدا.

ماذا فعلت 'size a.out"أخبرك عن حجم التعليمات البرمجية والبيانات وشرائح BSS؟ من المحتمل أن يكون غالبية الكود هو رمز البدء (الكلاسيكي) crt0.o على أجهزة UNIX) التي تم استدعاءها بواسطة O / S وتنشئ العمل (مثل فرز حجج سطر الأوامر في Argc، Argv) قبل الاحتجاج main().

تشغيل الشريط على ثنائي للتخلص من الرموز. مع نسخة من دول مجلس التعاون الخليجي 3.4.4 (Cygming Special) إسقاط من 10K إلى 4K.

يمكنك محاولة ربط وقت التشغيل المخصص (الجزء الذي يستدعي الرئيسية) لإعداد بيئة وقت التشغيل الخاص بك. تستخدم جميع البرامج نفسها لإعداد بيئة وقت التشغيل التي تأتي مع دول مجلس التعاون الخليجي ولكن لكي لا تحتاج إلى بياناتك أو ذاكرة صفرية. الوسائل التي يمكن أن تتخلص من وظائف المكتبة غير المستخدمة مثل memset / memcpy وتقليل حجم CRT0. عند البحث عن معلومات حول هذه النظرة في دول مجلس التعاون الخليجي في بيئة مضمنة. المطورين المضمنين عامة الأشخاص الذين يستخدمون بيئات وقت التشغيل المخصصة.

الباقي هو النفقات العامة لنظام التشغيل الذي يقوم بتحميل الملف القابل للتنفيذ. أنت لن تنفسك كثيرا إلا إذا قمت بنوع ذلك باليد؟

باستخدام دول مجلس التعاون الخليجي، ترجمة البرنامج الخاص بك باستخدام -Os بدلا من واحدة من أعلام التحسين الأخرى (-O2 أو -O3). هذا يخبره لتحسين الحجم بدلا من السرعة. بالمناسبة، يمكن أن تجعل البرامج في بعض الأحيان تعمل بشكل أسرع من تحسين السرعة، إذا حدث بعض القطاع الحرج لتناسب أكثر بشكل جيد. من ناحية أخرى، -O3 يمكن أن تحفز في الواقع زيادة حجم التعليمات البرمجية.

قد يكون هناك أيضا بعض أعلام روابط تخبره بمغادرة قانون غير مستخدم من الثنائي النهائي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top