سؤال

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

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

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

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

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

المحلول

ملخص: -symbolic يمنع دالة الكائن داخل المشاركة

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

مثال كلاسيكي واحد هو malloc (). في الحالة الأكثر شيوعًا ، يتم تعريف Malloc () داخل LIBC. ولكن يمكنك تداخل نسختك الخاصة من Malloc عن طريق تحميل مكتبة تحدد هذا الرمز قبل تحميل libc (تتيح لك معظم روابط وقت التشغيل استخدام LD_Preload إلى مكتبات محددة للتحميل قبل التنفيذ).

بشكل افتراضي ، فإن أي وظيفة داخل كائن مشترك غير ثابت هو رمز عالمي. ولهذا السبب ، يمكن التداخل على أي وظائف داخل الكائن المشترك. ضع في اعتبارك سيناريو يكون فيه كائن مشترك يحتوي على وظيفة High_level () و Low_level () و High_level () يدعو LOW_LEVEL () كجزء من تنفيذها ولا HITE_LEVEL () أو LOW_LEVEL () هي وظائف ثابتة.

من الممكن أن تتدخل LOW_LEVEL () بحيث يقوم HIGH_LEVEL () باستدعاء LOW_LEVEL () من كائن مشترك مختلف.

هذا هو المكان الذي يأتي فيه -symbolic. عند إنشاء كائن مشترك ، سيرى الرابط أن LOW_LEVEL () محددة في نفس الكائن المشترك مثل HIGH_LEVEL () وربط المكالمة بحيث لا يمكن التداخل عليها. وبهذه الطريقة ، أنت تعلم أن أي مكالمات من وظيفة واحدة في كائنك المشترك إلى آخر في نفس الكائن المشترك لن يتم التداخل عليها أبدًا.

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