2009-05-02 20 views
57

जीसीसी में साझा पुस्तकालयों को संकलित करते समय -एफपीआईसी विकल्प कोड को स्वतंत्र स्थिति के रूप में संकलित करता है। क्या कोई कारण है (प्रदर्शन या अन्यथा) आप सभी कोड स्थिति को स्वतंत्र क्यों नहीं संकलित करेंगे?सभी कोड संकलित स्थिति स्वतंत्र क्यों नहीं है?

+1

लेकिन वाह पूरी तरह से सही नहीं है। कई फ़ंक्शन कॉल और कूदता रिश्तेदार कूद का उपयोग करते हैं ताकि उन्हें चारों ओर स्थानांतरित होने के बाद भी एक जंप टेबल की आवश्यकता न हो। – Unknown

+0

जेनरेट किए गए असेंबली कोड को देखते हुए ऐसा लगता है कि फ़ंक्शन का पता लोड किया गया है, जो कभी भी नहीं है, यह एक कूद है। क्या मैं आपके बयान को गलत समझ रहा हूं? – ojblass

+0

@ojblass मेरा मतलब यह है कि कुछ कूद "0x400000 पर कूदने" के बजाय "यहां से 50 से अधिक निर्देशों को कूदें" या "5 निर्देशों को पीछे की ओर कूदें" जैसे हैं। तो कहने के लिए कि आपको हर बार एक पता लोड करना होगा -एफपीआईसी पूरी तरह से सच नहीं है। – Unknown

उत्तर

45

यह एक अविवेक कहते हैं। स्थिति स्वतंत्र कोड के साथ आपको अपने फ़ंक्शन का पता लोड करना होगा और फिर उस पर कूदना होगा। आम तौर पर फ़ंक्शन का पता पहले से ही निर्देश स्ट्रीम में मौजूद है।

+2

सादगी के लिए चुना गया। – ojblass

24

हाँ वहाँ प्रदर्शन कारण हैं। मेमोरी में पूर्ण स्थिति प्राप्त करने के लिए कुछ पहुंच प्रभावशाली ढंग से एक और परत के तहत प्रभावी होती हैं।

वहाँ भी है GOT (ग्लोबल ऑफसेट तालिका) जो वैश्विक चर की ऑफसेट संग्रहीत करता है। मेरे लिए, यह सिर्फ आईएटी फिक्सअप टेबल की तरह दिखता है, जिसे विकिपीडिया और कुछ अन्य स्रोतों द्वारा निर्भर स्थिति के रूप में वर्गीकृत किया जाता है।

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

+1

मैं ऊपर उठ रहा हूं लेकिन सरासर सादगी के लिए दूसरे का चयन कर रहा हूं। – ojblass

1

इसके अलावा, अधिकांश आधुनिक प्रोसेसर (अधिकांश आधुनिक ओएस द्वारा उपयोग किए जाने वाले) में वर्चुअल मेमोरी हार्डवेयर का अर्थ है कि बहुत सारे कोड (एमएमएपी या इसी तरह के क्विर्की उपयोग को छोड़कर सभी उपयोगकर्ता स्पेस ऐप्स) को स्वतंत्र स्थिति की आवश्यकता नहीं है। प्रत्येक कार्यक्रम को अपना पता स्थान मिलता है जो इसे शून्य पर शुरू होता है।

+0

क्या उन आवेदकों को इस तरह से कोड करना आसान है? – ojblass

+3

लेकिन एक वीएम-एमएमयू पीआईसी कोड के साथ भी यह सुनिश्चित करने के लिए आवश्यक है। इसलिए लाइब्रेरी को केवल एक बार स्मृति में लोड किया जाता है जब इसे विभिन्न निष्पादन योग्य द्वारा उपयोग किया जाता है। – mmmmmmmm

14
स्वीकार किए जाते हैं जवाब के अलावा

। एक चीज जो पीआईसी कोड प्रदर्शन को दिक्कत देती है वह x86 पर "आईपी रिश्तेदार एड्रेसिंग" की कमी है। "आईपी सापेक्ष एड्रेसिंग" के साथ आप वर्तमान निर्देश सूचक से एक्स बाइट्स वाले डेटा के लिए पूछ सकते हैं। यह पीआईसी कोड को बहुत आसान बना देगा।

कूदता है और कॉल, आमतौर पर EIP रिश्तेदार हैं, इसलिए उन वास्तव में एक समस्या पैदा नहीं करते। हालांकि, डेटा तक पहुंचने के लिए थोड़ा अतिरिक्त चालबाजी की आवश्यकता होगी। कभी-कभी, एक रजिस्टर को डेटा के लिए अस्थायी रूप से "बेस पॉइंटर" के रूप में आरक्षित किया जाएगा जिसे कोड की आवश्यकता होती है।

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 

यह और अन्य तकनीकों के लिए डेटा तक अविवेक की एक परत जोड़ें: उदाहरण के लिए, एक आम तकनीक रास्ता कॉल 86 पर काम का दुरुपयोग किया जा सके। उदाहरण के लिए, जीसीसी (ग्लोबल ऑफसेट टेबल) जीसीसी कंपाइलर्स द्वारा उपयोग किया जाता है।

x86-64 ने "आरआईपी सापेक्ष" मोड जोड़ा जो चीजों को बहुत सरल बनाता है।

+1

आईआईआरसी एमआईपीएस में पीसी-सापेक्ष एड्रेसिंग भी नहीं है, रिश्तेदार कूद –

2

क्योंकि पूरी तरह से स्वतंत्र कोड की स्थिति को लागू करने कोड जनरेटर जो तेजी से आपरेशन के उपयोग को रोका जा सकता है, या उस बाधा को संरक्षित करने के लिए अतिरिक्त कदम जोड़ने के लिए एक बाधा कहते हैं।

वर्चुअल मेमोरी सिस्टम के बिना मल्टीप्रोसेसिंग प्राप्त करने के लिए यह एक स्वीकार्य व्यापार-बंद हो सकता है, जहां आप प्रक्रियाओं पर भरोसा करते हैं कि वे एक दूसरे की स्मृति पर आक्रमण न करें और किसी भी मूल पते पर किसी विशेष एप्लिकेशन को लोड करने की आवश्यकता हो।

कई आधुनिक प्रणालियों में प्रदर्शन व्यापार-बंद अलग-अलग होते हैं, और एक स्थानापन्न लोडर अक्सर कम महंगा होता है (यदि किसी भी समय कोड को पहली बार लोड किया जाता है) तो सर्वश्रेष्ठ अनुकूलक के मुकाबले सर्वश्रेष्ठ अनुकूलक कर सकता है। साथ ही, आभासी पता रिक्त स्थान की उपलब्धता पहली जगह स्थिति स्वतंत्रता के लिए प्रेरणा से अधिकतर छुपाती है।

21

This article बताता है कि पीआईसी कैसे काम करता है और इसकी तुलना वैकल्पिक रूप से करता है - load time relocation। मुझे लगता है कि यह आपके प्रश्न के लिए प्रासंगिक है। क्योंकि यह एक अतिरिक्त रजिस्टर की आवश्यकता है

+4

प्रासंगिक पोस्ट को छोड़कर! = उत्तर – Nick

+10

@ निक: मैं असहमत हूं। अगर यह पूछताछ में मदद करता है, तो यह एक जवाब है। एक प्रासंगिक लेख या दो को इंगित करने से जानकारी का भरपूर धन मिल सकता है। –

+3

इस पोस्ट में कोई निष्कर्ष नहीं है, केवल एक लेख के लिए एक लिंक है। प्रदर्शन संकेतों के कारण डिफ़ॉल्ट रूप से पीआईसी का उपयोग नहीं किया गया है कि एक सुराग भी नहीं है। – Nick

1

position-independent code, सबसे वास्तुकला पर एक प्रदर्शन भूमि के ऊपर है।

तो, यह प्रदर्शन उद्देश्य के लिए है।

0

आजकल ऑपरेटिंग सिस्टम और कंपाइलर डिफ़ॉल्ट रूप से सभी कोड को स्थिति कोड के रूप में बनाते हैं। -एफपीआईसी ध्वज के बिना संकलन करने का प्रयास करें, कोड ठीक संकलित होगा लेकिन आपको केवल एक चेतावनी मिलेगी। ओएस की तरह खिड़कियां इसे प्राप्त करने के लिए मेमोरी मैपिंग नामक तकनीक का उपयोग करती हैं।

संबंधित मुद्दे