رابط قابل للنقل

في GNU ld ، ينتج -r ملف كائن قابل لإعادة تحديد موضعه. وهذا ما يسمى الربط القابل للنقل أو الربط الجزئي. يزيل هذا الوضع العديد من التمريرات التي تم إجراؤها لإخراج كائن قابل للتنفيذ أو مشترك (في أوضاع-no-pie / -pie / -shared). -r و-no-pie و -pie و -shared حدد 4 أوضاع مختلفة. الخيارات الأربعة متعارضة.

يمكن استخدام الإخراج القابل للنقل للتحليل والمعالجة الثنائية. ثم يمكن استخدام المخرجات لربط الكائن النهائي القابل للتنفيذ أو الكائن المشترك.

123456 clang -pie a.o b.o # ==> clang -r a.o b.o -o r.oclang -pie r.o

دعنا نمر عبر ممرات مختلفة للرابط ونرى كيف يغير الرابط القابل للنقل العملية. بحث وتحليل ملفات الإدخال

يُسمح فقط بملفات الكائنات وملفات الأرشيف والبرامج النصية للرابط القابل للسحب كإدخال. لدعم LTO ، قد يُسمح أيضًا بنوع ملف آخر. تؤدي الملفات الأخرى إلى حدوث خطأ. <الشكل فئة = "تسليط الضوء على عادي"> 12 ٪ ld -r a.o b.sold.lld: خطأ: محاولة الربط الثابت للكائن الديناميكي b.so

يتم تنفيذ دقة COMDAT وقد تتخطى أقسامًا معينة وبالتالي يتم تحديد الرموز المتعلقة بها. دقة الرمز

لا يقوم الرابط بأي معالجة خاصة لإصدار الرموز. @ وفي أسماء الرموز متروكة كما هي.

لا يعرف الرابط الرموز المحجوزة (مثل __ehdr_start ، _GLOBAL_OFFSET_TABLE_). لا يحدد الرابط رموز الغلاف (__start_ $ section، _stop_ $ section) لأقسام اسم معرف C.

عند استخدام LTO ، تفترض LTO أنه يمكن استخدام جميع الرموز غير المحلية وتجنب تجاهلها. إنشاء أقسام تركيبية

لا يقوم الرابط بإنشاء أقسام مركبة (.interp و .gnu.hash و .got و .plt و .comment وما إلى ذلك). تعيين أقسام الإدخال والأقسام التركيبية إلى أقسام الإخراج

يزيل GNU ld نص الرابط الداخلي. لا يوجد تعيين افتراضي مثل .text. * إلى .text و .data. * إلى .data وما إلى ذلك.

يمكنك كتابة نص رابط لتعيين أقسام.

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

تم تجاهل كلمة المرور هذه. لا يحدد الرابط ما إذا كانت هناك حاجة إلى GOT / PLT / TLSDESC / TLSGD / إلخ. تخطيط وتعيين العناوين

لا تحصل أقسام الإخراج على أي عناوين.

يتم إنشاء رأس ELF وجدول رؤوس الأقسام كالمعتاد. تتم إزالة رؤوس البرامج. نسخ محتويات القسم لإخراج وحل عمليات النقل

يحول الرابط عمليات النقل المتعلقة بأقسام الإدخال إلى عمليات نقل متعلقة بأقسام الإخراج. هذا مشابه لـ --emit-relocs. يمكن تعديل الإضافات ويمكن أن تؤدي الإضافات الضمنية إلى تغييرات في محتوى القسم.

قد يتم حذف بعض الأقسام. بالنسبة للقسم غير SHF_ALLOC ، يطبق ld.lld قيم تعطيل لعمليات النقل التي تشير إلى رمز محدد متعلق بقسم تم تجاهله.

لم يتم تعيين الرموز الشائعة.

بالنسبة للممرات الرئيسية المذكورة أعلاه ، يبدو أن الروابط القابلة للنقل تتجاهل معظمها. ومع ذلك ، هناك الكثير من الميزات الثانوية التي يمكن إعادة تحديد موضع مشاركات الربط مع أوضاع الربط العادية (-no-pie، -pie، -shared): ، إلخ.

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

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

-r --gc-categories معًا. أضفت دعمًا لـ ld.lld في https://reviews.llvm.org/D84131. لا يعرّف الارتباط القابل للنقل رمز إدخال افتراضي (عادةً _start). يجب علينا تكوين جذور GC (- المدخل و -u) لاستخدام -r --gc -ections.

قد يؤدي الرابطان التاليان إلى نتائج مختلفة.

في GNU ld ، ينتج -r ملف كائن قابل لإعادة تحديد موضعه. وهذا ما يسمى الربط القابل للنقل أو الربط الجزئي. يزيل هذا الوضع العديد من التمريرات التي تم إجراؤها لإخراج كائن قابل للتنفيذ أو مشترك (في أوضاع-no-pie / -pie / -shared). -r و-no-pie و -pie و -shared حدد 4 أوضاع مختلفة. الخيارات الأربعة متعارضة.

يمكن استخدام الإخراج القابل للنقل للتحليل والمعالجة الثنائية. ثم يمكن استخدام المخرجات لربط الكائن النهائي القابل للتنفيذ أو الكائن المشترك.

123456 clang -pie a.o b.o # ==> clang -r a.o b.o -o r.oclang -pie r.o

دعنا نمر عبر ممرات مختلفة للرابط ونرى كيف يغير الرابط القابل للنقل العملية. بحث وتحليل ملفات الإدخال

يُسمح فقط بملفات الكائنات وملفات الأرشيف والبرامج النصية للرابط القابل للسحب كإدخال. لدعم LTO ، قد يُسمح أيضًا بنوع ملف آخر. تؤدي الملفات الأخرى إلى حدوث خطأ. <الشكل فئة = "تسليط الضوء على عادي"> 12 ٪ ld -r a.o b.sold.lld: خطأ: محاولة الربط الثابت للكائن الديناميكي b.so

يتم تنفيذ دقة COMDAT وقد تتخطى أقسامًا معينة وبالتالي يتم تحديد الرموز المتعلقة بها. دقة الرمز

لا يقوم الرابط بأي معالجة خاصة لإصدار الرموز. @ وفي أسماء الرموز متروكة كما هي.

لا يعرف الرابط الرموز المحجوزة (مثل __ehdr_start ، _GLOBAL_OFFSET_TABLE_). لا يحدد الرابط رموز الغلاف (__start_ $ section، _stop_ $ section) لأقسام اسم معرف C.

عند استخدام LTO ، تفترض LTO أنه يمكن استخدام جميع الرموز غير المحلية وتجنب تجاهلها. إنشاء أقسام تركيبية

لا يقوم الرابط بإنشاء أقسام مركبة (.interp و .gnu.hash و .got و .plt و .comment وما إلى ذلك). تعيين أقسام الإدخال والأقسام التركيبية إلى أقسام الإخراج

يزيل GNU ld نص الرابط الداخلي. لا يوجد تعيين افتراضي مثل .text. * إلى .text و .data. * إلى .data وما إلى ذلك.

يمكنك كتابة نص رابط لتعيين أقسام.

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

تم تجاهل كلمة المرور هذه. لا يحدد الرابط ما إذا كانت هناك حاجة إلى GOT / PLT / TLSDESC / TLSGD / إلخ. تخطيط وتعيين العناوين

لا تحصل أقسام الإخراج على أي عناوين.

يتم إنشاء رأس ELF وجدول رؤوس الأقسام كالمعتاد. تتم إزالة رؤوس البرامج. نسخ محتويات القسم لإخراج وحل عمليات النقل

يحول الرابط عمليات النقل المتعلقة بأقسام الإدخال إلى عمليات نقل متعلقة بأقسام الإخراج. هذا مشابه لـ --emit-relocs. يمكن تعديل الإضافات ويمكن أن تؤدي الإضافات الضمنية إلى تغييرات في محتوى القسم.

قد يتم حذف بعض الأقسام. بالنسبة للقسم غير SHF_ALLOC ، يطبق ld.lld قيم تعطيل لعمليات النقل التي تشير إلى رمز محدد متعلق بقسم تم تجاهله.

لم يتم تعيين الرموز الشائعة.

بالنسبة للممرات الرئيسية المذكورة أعلاه ، يبدو أن الروابط القابلة للنقل تتجاهل معظمها. ومع ذلك ، هناك الكثير من الميزات الثانوية التي يمكن إعادة تحديد موضع مشاركات الربط مع أوضاع الربط العادية (-no-pie، -pie، -shared): ، إلخ.

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

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

-r --gc-categories معًا. أضفت دعمًا لـ ld.lld في https://reviews.llvm.org/D84131. لا يعرّف الارتباط القابل للنقل رمز إدخال افتراضي (عادةً _start). يجب علينا تكوين جذور GC (- المدخل و -u) لاستخدام -r --gc -ections.

قد يؤدي الرابطان التاليان إلى نتائج مختلفة.

What's Your Reaction?

like

dislike

love

funny

angry

sad

wow