سؤال

لدي مكتبة ثابتة *.lib تم إنشاؤها باستخدام MSVC على النوافذ.حجم المكتبة هو 70 كيلو بايت.ثم لدي تطبيق يربط هذه المكتبة.ولكن الآن أصبح حجم الملف القابل للتنفيذ النهائي (*.exe) هو 29 كيلو بايت، أي أقل من حجم المكتبة.ما أريد أن أعرفه هو:

  1. نظرًا لأن المكتبة مرتبطة بشكل ثابت، كنت أفكر في أنه يجب إضافتها مباشرة إلى الحجم القابل للتنفيذ ويجب أن يكون حجم exe النهائي أكبر من ذلك؟هل يقوم تنسيق Windows exe أيضًا ببعض ضغط البيانات الثنائية؟

  2. كيف يتم الأمر بالنسبة لأنظمة Linux، أي كيف ترتبط أحجام المكتبة على Linux (ملف *.a/*.la) بحجم Linux القابل للتنفيذ (*.out)؟

-إعلان

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

المحلول

هناك معلومات مسك الدفاتر إضافية في .lib الملف غير المطلوب للملف النهائي القابل للتنفيذ.تساعد هذه المعلومات الرابط في العثور على الكود المراد ربطه فعليًا.أيضًا، قد يتم تخزين معلومات التصحيح في ملف .lib الملف ولكن ليس في .exe ملف (لا أتذكر مكان تخزين معلومات تصحيح الأخطاء لـ objs في ملف lib، فقد يكون في مكان آخر).

نصائح أخرى

المكتبة الثابتة على كل من Windows وUnix هي عبارة عن مجموعة من ملفات .obj/.o.يبحث الرابط في كل ملف من ملفات الكائنات هذه ويحدد ما إذا كان البرنامج بحاجة إلى الارتباط أم لا.إذا لم تكن هناك حاجة إليه، فلن يتم تضمين ملف الكائن في الملف القابل للتنفيذ النهائي.يمكن أن يؤدي هذا إلى ملفات تنفيذية أصغر من المكتبة.

يحرر:كما يشير MSalters، يدعم برنامج التحويل البرمجي VC++ الآن على نظام التشغيل Windows إنشاء ملفات كائنات تتيح الارتباط على مستوى الوظيفة، على سبيل المثال، راجع هنا.في الواقع، يتطلب التحرير والمتابعة هذا، نظرًا لأن التحرير والمتابعة يجب أن يكون قادرًا على استبدال أصغر جزء ممكن من الملف القابل للتنفيذ.

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

تنصل:لقد مر وقت طويل منذ أن تعاملت مع الارتباط الثابت، لذا خذ إجابتي بحذر.

انت كتبت: كنت أفكر أنه يجب أن يضاف مباشرة إلى الحجم القابل للتنفيذ ويجب أن يكون حجم exe النهائي أكثر من ذلك؟

تعمل الروابط البسيطة بهذه الطريقة تمامًا - عندما كنت أقوم بتطوير هواية لأنظمة CP/M (منذ وقت طويل)، كانت هذه مشكلة حقيقية.

ومع ذلك، تعد الروابط الحديثة أكثر ذكاءً - فهي ترتبط فقط بالوظائف المشار إليها بواسطة الكود الأصلي، أو حسب الحاجة.

بالإضافة إلى الإجابات الحالية، يُسمح للرابط بإزالة تعريفات الوظائف إذا كانت تحتوي على رمز كائن متطابق - ويهدف هذا إلى المساعدة في تقليل التأثيرات المتضخمة للتعليمات البرمجية القالبة.

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

@الجميع:شكرا على المؤشرات.@ جريج هيوجيل - كانت إجابتك مؤشرًا جيدًا.شكرًا.

والجواب الذي وجدته كان كالتالي:

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

2.) عندما قمت بتعطيل الخيار "Keep Program debug databse"، حصلت على مكتبة كان حجمها أصغر من الملف القابل للتنفيذ النهائي، وهو ما اعتقدت أنه طبيعي في معظم المواقف.

-إعلان

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