لماذا لا يتم تجميع كل التعليمات البرمجية بشكل مستقل؟

StackOverflow https://stackoverflow.com/questions/813980

  •  03-07-2019
  •  | 
  •  

سؤال

عند تجميع المكتبات المشتركة في دول مجلس التعاون الخليجي، يقوم الخيار -fPIC بتجميع التعليمات البرمجية كموضع مستقل.هل هناك أي سبب (الأداء أو غير ذلك) لعدم تجميع كل موضع الكود بشكل مستقل؟

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

المحلول

وتضيف المراوغة. مع موقف كود مستقل لديك لتحميل عنوان الدالة ومن ثم القفز عليه. عادة عنوان الدالة موجود بالفعل في مجرى التعليمات.

نصائح أخرى

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

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

http://en.wikipedia.org/wiki/Position_independent_code

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

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

call label_1
.dd 0xdeadbeef
.dd 0xfeedf00d
.dd 0x11223344
label_1:
pop ebp            ; now ebp holds the address of the first dataword
                   ; this works because the call pushes the **next**
                   ; instructions address
                   ; real code follows
mov eax, [ebp + 4] ; for example i'm accessing the '0xfeedf00d' in a PIC way

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

أضاف الإصدار x86-64 وضع "RIP النسبي" الذي يجعل الأمور أ كثير أبسط.

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

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

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

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

وposition-independent code لديه النفقات العامة الأداء على معظم الهندسة المعمارية، لأنه يتطلب تسجيل إضافية.

وهكذا، وهذا هو لغرض أداء.

ونظام التشغيل في الوقت الحاضر ومترجم افتراضيا جعل جميع الكود كما وضع قانون مستقل. محاولة تجميع دون علم -fPIC، ورمز تجميع ما يرام ولكن سوف مجرد الحصول على warning.OS في مثل ويندوز تستخدم تقنية تسمى كتعيين الذاكرة لتحقيق ذلك.

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