Relocation (computing)

In software development, relocation is the process of assigning load addresses for position-dependent code and data of a program and adjusting the code and data to reflect the assigned addresses.[1][2]

A linker usually performs relocation in conjunction with symbol resolution, the process of searching files and libraries to replace symbolic references or names of libraries with actual usable addresses in memory before running a program.

Relocation is typically done by the linker at link time, but it can also be done at load time by a relocating loader, or at run time by the running program itself.

Segmentation

Object files are typically segmented into various memory segments or section types. Example segment types include code segment (.text), initialized data segment (.data), uninitialized data segment (.bss), or others as established by the programmer, such as common segments or named static segments.

Relocation table

The relocation table is a list of addresses created by a compiler or assembler and stored in the object or executable file. Each entry in the table references an absolute address in the object code that must be changed when the loader relocates the program so that it will refer to the correct location. Entries in the relocation table are known as fixups and are designed to support relocation of the program as a complete unit. In some cases, each fixup in the table is itself relative to a base address of zero, so the fixups themselves must be changed as the loader moves through the table.[2]

In some architectures, a fixup that crosses certain boundaries (such as a segment boundary) or that is not aligned on a word boundary is illegal and flagged as an error by the linker.[3]

DOS and 16-bit Windows

Far pointers (32-bit pointers with segment:offset, used to address 20-bit 640 KB memory space available to DOS programs), which point to code or data within a DOS executable (EXE), do not have absolute segments, because the actual address of code or data depends on where the program is loaded in memory and this is not known until the program is loaded.

بدلاً من ذلك، تُعدّ المقاطع قيماً نسبية في ملف DOS EXE. يجب تصحيح هذه المقاطع عند تحميل الملف التنفيذي في الذاكرة. يستخدم مُحمّل ملفات EXE جدول إعادة التوطين للعثور على المقاطع التي تحتاج إلى تعديل.

ويندوز

مع أنظمة تشغيل ويندوز 32 بت، ليس من الضروري توفير جداول إعادة التوطين لملفات EXE، لأنها أول صورة يتم تحميلها في مساحة العنوان الظاهري وبالتالي سيتم تحميلها في عنوانها الأساسي المفضل.

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

يمكن وضع علامة "متوافق مع ASLR" على ملفات ويندوز التنفيذية. تتوفر هذه الميزة في ويندوز 8 والإصدارات الأحدث، حيث يمكن تفعيل ASLR حتى للتطبيقات غير المصنفة على أنها متوافقة. [ 4 ] ولضمان التشغيل الناجح في هذه البيئة، لا يمكن للمترجم حذف أقسام إعادة التوجيه.

أنظمة شبيهة بنظام يونكس

يُتيح تنسيق الملفات التنفيذية والمكتبات المشتركة (ELF)، المستخدم في معظم الأنظمة الشبيهة بنظام يونكس، تعريف أنواع متعددة من عمليات النقل. [ 5 ] : 1-22

على غرار الوضع في نظام ويندوز، يجب أن تكون المكتبات قابلة للنقل (أي تحتوي على كود مستقل عن الموقع وجداول مصاحبة)، بينما يمكن جعل الملفات التنفيذية قابلة للنقل اختيارياً لتقنية ASLR. تُعرف الملفات التنفيذية القابلة للنقل أيضاً بالملفات التنفيذية المستقلة عن الموقع .

إجراءات النقل

يقوم الرابط بقراءة معلومات القطاعات وجداول إعادة التوطين في ملفات الكائنات، وينفذ عملية إعادة التوطين عن طريق:

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

مثال

يستخدم المثال التالي بنية MIX الخاصة بدونالد كنوث ولغة التجميع MIXAL. تبقى المبادئ نفسها لأي بنية، مع اختلاف التفاصيل.

  • (أ) يتم تجميع البرنامج SUBR لإنتاج ملف الكائن (ب)، الموضح بصيغتي لغة الآلة ولغة التجميع. قد يُحدد المُجمِّع بداية الكود المُجمَّع في موقع عشوائي، غالبًا الموقع 1، كما هو موضح. يحتوي الموقع 13 على كود الآلة لتعليمات القفز إلى العبارة ST في الموقع 5.
  • (ج) إذا تم ربط SUBR لاحقًا بشفرة أخرى، فقد يتم تخزينها في موقع آخر غير 1. في هذا المثال، يضعها الرابط في الموقع 120. يجب نقل العنوان الموجود في تعليمة القفز، والذي يوجد الآن في الموقع 133، ليشير إلى الموقع الجديد لشفرة العبارة ST ، والذي أصبح الآن 125. [1 61 الموضح في التعليمة هو تمثيل شفرة الآلة MIX للرقم 125].
  • (د) عند تحميل البرنامج في الذاكرة لتشغيله، قد يتم تحميله في موقع مختلف عن الموقع الذي حدده الرابط. يوضح هذا المثال أن SUBR موجود الآن في الموقع 300. يجب إعادة توجيه العنوان الموجود في تعليمة القفز، الموجود الآن في الموقع 313، بحيث يشير إلى الموقع المُحدَّث لـ ST ، وهو 305. [4 49 هو تمثيل آلة MIX للموقع 305].

البدائل

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

انظر أيضاً

مراجع

  1. "أنواع كود الكائن". دليل مرجعي لمحمل تطبيقات iRMX 86 ( ملف PDF) . إنتل . الصفحات  1-2-1-3 . مؤرشف (ملف PDF) من الأصل بتاريخ 11-01-2020 . تم الاسترجاع بتاريخ 11-01-2020 . [...] الكود المطلق ، ووحدة الكائن المطلقة، هو كود تمت معالجته بواسطة LOC86 ليتم تشغيله فقط في موقع محدد في الذاكرة. يقوم المحمل بتحميل وحدة الكائن المطلقة فقط في الموقع المحدد الذي يجب أن تشغله الوحدة. يختلف الكود المستقل عن الموقع (المشار إليه عادةً باسم PIC) عن الكود المطلق في أنه يمكن تحميل PIC في أي موقع ذاكرة. ميزة PIC على الكود المطلق هي أن PIC لا يتطلب منك حجز كتلة ذاكرة محددة. عندما يقوم المحمل بتحميل PIC، فإنه يحصل على مقاطع ذاكرة iRMX 86 من مجموعة مهام المهمة المستدعِية ويقوم بتحميل PIC في هذه المقاطع. من القيود المتعلقة بمعالج PIC، كما هو الحال في نموذج التجزئة PL/M-86 COMPACT، أنه لا يمكن أن يحتوي إلا على مقطع واحد للتعليمات البرمجية ومقطع واحد للبيانات، بدلاً من السماح لعناوين الأساس لهذه المقاطع، وبالتالي المقاطع نفسها، بالتغير ديناميكيًا. هذا يعني أن برامج PIC يجب ألا يتجاوز طولها 64 كيلوبايت. يمكن إنتاج كود PIC باستخدام أمر BIND في معالج LINK86. أما الكود القابل للتحديد وقت التحميل (المعروف باسم كود LTL) فهو الشكل الثالث من كود الكائن. يشبه كود LTL معالج PIC في إمكانية تحميله في أي مكان في الذاكرة. مع ذلك، عند تحميل كود LTL، يقوم المحمل بتغيير الجزء الأساسي من المؤشرات بحيث تصبح هذه المؤشرات مستقلة عن المحتويات الأولية للسجلات في المعالج الدقيق. بفضل هذا التعديل (ضبط عناوين الأساس)، يمكن استخدام كود LTL في المهام التي تحتوي على أكثر من مقطع واحد للتعليمات البرمجية أو أكثر من مقطع واحد للبيانات. هذا يعني أن برامج LTL قد يتجاوز طولها 64 كيلوبايت. تُنتج لغتا FORTRAN 86 و Pascal 86 تلقائيًا كود LTL، حتى للبرامج القصيرة. ويمكن إنتاج كود LTL باستخدام خاصية BIND في معالج LINK86. […]
  2. 1 2 ليفين، جون ر. (2000) [أكتوبر 1999]. "الفصل 1: الربط والتحميل والفصل 3: ملفات الكائنات". الروابط والمحملات . سلسلة مورغان كوفمان في هندسة البرمجيات والبرمجة ( الطبعة الأولى). سان فرانسيسكو، كاليفورنيا، الولايات المتحدة الأمريكية: مورغان كوفمان . ص 5. ISBN   1-55860-496-0. OCLC 42413382 . تم الاسترجاع في 12 يناير 2020 . {{cite book}}: CS1 maint: deprecated archiveal service ( link ) Code:تصحيحات:
  3. بورلاند (1999-09-01) [1998-07-02]. "مقالة بورلاند رقم 15961: التعامل مع رسائل 'Fixup Overflow'" . community.borland.com . قاعدة بيانات المعلومات التقنية - المنتج: Borland C++ 3.1. TI961C.txt #15961. مؤرشفة من الأصل بتاريخ 2008-07-07 . تم الاطلاع عليها بتاريخ 2007-01-15 .
  4. "ست حقائق حول عشوائية تخطيط مساحة العناوين في نظام ويندوز" . 17 مارس 2020. تم الاطلاع عليه بتاريخ 24 يوليو 2020 .
  5. "تنسيق قابل للتنفيذ والربط (ELF)" (ملف PDF) . skyfree.org . مواصفات تنسيقات واجهة الأدوات (TIS) المحمولة، الإصدار 1.1. مؤرشف من الأصل (ملف PDF) بتاريخ 24-12-2019 . تم الاطلاع عليه بتاريخ 01-10-2018 .

للمزيد من القراءة