سؤال

لقد كنت دائمًا في حيرة من أمري بشأن كيفية عمل الرابط، وهو موضوع يصعب البحث عنه.

لتوضيح سؤالي ولتوفير إطار عمل للإجابة، سأدون ما أعرفه (أو أعتقد أنني أعرفه) حتى الآن.قد أكون مخطئا جدا.:)

أولاً، يتم دمج كل ملف .cpp في ملف وسيط (.o لـ Posix/ELF و .obj لـ Win/PE على ما أعتقد).يحتوي هذا الملف الوسيط على كافة الرموز المحددة بواسطة ملف .cpp الذي تم إنشاؤه منه ويحتوي على تعليمات حول الروابط الخارجية التي يحتاج إلى حلها بشكل صحيح.كامتداد لهذا، تتيح لك أنظمة Posix دمج ملفات .o في ملف .a (والذي يبدو أنه لا يفعل أي شيء أكثر من الجمع؟ما الأمر الذي يفعل هذا؟).هل .lib هو المكافئ Win/PE لملف Posix .a؟

بعد ذلك، يتم ربط الملفات الوسيطة معًا، وحل التبعيات الخارجية، ويصبح لديك الملف القابل للتنفيذ.هل أفتقد أي خطوات؟

شكرًا!

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

المحلول

إليك بعض قطع اللغز:

  • يتم استخدام ar(1) لإنشاء ملفات .a.فهي تشبه ملفات TAR (1) أو ZIP (ربما مع فهرس للبحث عن ملف كائن حسب اسم الرمز)
  • يقوم الرابط بنسخ أقسام ملفات الكائنات معًا (نص، بيانات، bss).بالنسبة إلى GNU ld، يمكن التحكم في النسخ الدقيق للأقسام باستخدام برنامج نصي للرابط (على سبيل المثال.انسخ جميع الأقسام من ملفات .o التي تحتوي على "نص" في أسمائها إلى قسم نصي واحد)
  • يقوم الرابط أيضًا بعمليات النقل:تعليمات التصحيح (القفز وتحميل البيانات) مع العناوين المستهدفة المعنية، بمجرد معرفة قيمة الرمز.في بعض الحالات، لا يمكن القيام بذلك في وقت الارتباط، لذلك يقوم الرابط بنسخ/ضبط سجلات النقل من ملفات .o إلى الملف القابل للتنفيذ النهائي.
  • يخدم windows .lib غرضين:المكتبة الثابتة (.lib) تشبه المكتبات.لا تحتوي مكتبة الاستيراد (.lib) على التعليمات البرمجية الفعلية، ولكنها تحتوي على قوائم الرموز فقط.يمكن للرابط حل الرموز من مكتبة الاستيراد، ولكنه يعرف بعد ذلك أنه يحتاج إلى وضع مرجع إلى ملف .dll المقابل في الملف القابل للتنفيذ.في نظام Unix/ELF، يحتوي الملف .so على كل من الكود وجدول الرموز.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top