जीसीसी में साझा पुस्तकालयों को संकलित करते समय -एफपीआईसी विकल्प कोड को स्वतंत्र स्थिति के रूप में संकलित करता है। क्या कोई कारण है (प्रदर्शन या अन्यथा) आप सभी कोड स्थिति को स्वतंत्र क्यों नहीं संकलित करेंगे?सभी कोड संकलित स्थिति स्वतंत्र क्यों नहीं है?
उत्तर
यह एक अविवेक कहते हैं। स्थिति स्वतंत्र कोड के साथ आपको अपने फ़ंक्शन का पता लोड करना होगा और फिर उस पर कूदना होगा। आम तौर पर फ़ंक्शन का पता पहले से ही निर्देश स्ट्रीम में मौजूद है।
सादगी के लिए चुना गया। – ojblass
हाँ वहाँ प्रदर्शन कारण हैं। मेमोरी में पूर्ण स्थिति प्राप्त करने के लिए कुछ पहुंच प्रभावशाली ढंग से एक और परत के तहत प्रभावी होती हैं।
वहाँ भी है GOT (ग्लोबल ऑफसेट तालिका) जो वैश्विक चर की ऑफसेट संग्रहीत करता है। मेरे लिए, यह सिर्फ आईएटी फिक्सअप टेबल की तरह दिखता है, जिसे विकिपीडिया और कुछ अन्य स्रोतों द्वारा निर्भर स्थिति के रूप में वर्गीकृत किया जाता है।
मैं ऊपर उठ रहा हूं लेकिन सरासर सादगी के लिए दूसरे का चयन कर रहा हूं। – ojblass
इसके अलावा, अधिकांश आधुनिक प्रोसेसर (अधिकांश आधुनिक ओएस द्वारा उपयोग किए जाने वाले) में वर्चुअल मेमोरी हार्डवेयर का अर्थ है कि बहुत सारे कोड (एमएमएपी या इसी तरह के क्विर्की उपयोग को छोड़कर सभी उपयोगकर्ता स्पेस ऐप्स) को स्वतंत्र स्थिति की आवश्यकता नहीं है। प्रत्येक कार्यक्रम को अपना पता स्थान मिलता है जो इसे शून्य पर शुरू होता है।
। एक चीज जो पीआईसी कोड प्रदर्शन को दिक्कत देती है वह 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 ने "आरआईपी सापेक्ष" मोड जोड़ा जो चीजों को बहुत सरल बनाता है।
आईआईआरसी एमआईपीएस में पीसी-सापेक्ष एड्रेसिंग भी नहीं है, रिश्तेदार कूद –
क्योंकि पूरी तरह से स्वतंत्र कोड की स्थिति को लागू करने कोड जनरेटर जो तेजी से आपरेशन के उपयोग को रोका जा सकता है, या उस बाधा को संरक्षित करने के लिए अतिरिक्त कदम जोड़ने के लिए एक बाधा कहते हैं।
वर्चुअल मेमोरी सिस्टम के बिना मल्टीप्रोसेसिंग प्राप्त करने के लिए यह एक स्वीकार्य व्यापार-बंद हो सकता है, जहां आप प्रक्रियाओं पर भरोसा करते हैं कि वे एक दूसरे की स्मृति पर आक्रमण न करें और किसी भी मूल पते पर किसी विशेष एप्लिकेशन को लोड करने की आवश्यकता हो।
कई आधुनिक प्रणालियों में प्रदर्शन व्यापार-बंद अलग-अलग होते हैं, और एक स्थानापन्न लोडर अक्सर कम महंगा होता है (यदि किसी भी समय कोड को पहली बार लोड किया जाता है) तो सर्वश्रेष्ठ अनुकूलक के मुकाबले सर्वश्रेष्ठ अनुकूलक कर सकता है। साथ ही, आभासी पता रिक्त स्थान की उपलब्धता पहली जगह स्थिति स्वतंत्रता के लिए प्रेरणा से अधिकतर छुपाती है।
This article बताता है कि पीआईसी कैसे काम करता है और इसकी तुलना वैकल्पिक रूप से करता है - load time relocation। मुझे लगता है कि यह आपके प्रश्न के लिए प्रासंगिक है। क्योंकि यह एक अतिरिक्त रजिस्टर की आवश्यकता है
प्रासंगिक पोस्ट को छोड़कर! = उत्तर – Nick
@ निक: मैं असहमत हूं। अगर यह पूछताछ में मदद करता है, तो यह एक जवाब है। एक प्रासंगिक लेख या दो को इंगित करने से जानकारी का भरपूर धन मिल सकता है। –
इस पोस्ट में कोई निष्कर्ष नहीं है, केवल एक लेख के लिए एक लिंक है। प्रदर्शन संकेतों के कारण डिफ़ॉल्ट रूप से पीआईसी का उपयोग नहीं किया गया है कि एक सुराग भी नहीं है। – Nick
position-independent code
, सबसे वास्तुकला पर एक प्रदर्शन भूमि के ऊपर है।
तो, यह प्रदर्शन उद्देश्य के लिए है।
आजकल ऑपरेटिंग सिस्टम और कंपाइलर डिफ़ॉल्ट रूप से सभी कोड को स्थिति कोड के रूप में बनाते हैं। -एफपीआईसी ध्वज के बिना संकलन करने का प्रयास करें, कोड ठीक संकलित होगा लेकिन आपको केवल एक चेतावनी मिलेगी। ओएस की तरह खिड़कियां इसे प्राप्त करने के लिए मेमोरी मैपिंग नामक तकनीक का उपयोग करती हैं।
- 1. यह सी ++ टेम्पलेट कोड संकलित क्यों नहीं करता है?
- 2. यह सी # कोड संकलित क्यों नहीं करता है?
- 3. यह सी कोड संकलित क्यों करता है?
- 4. यह कोड स्निपेट संकलित क्यों करता है?
- 5. यह हास्केल कोड क्यों संकलित करता है?
- 6. यह reinterpret_cast संकलित क्यों नहीं करता है?
- 7. display_errors HTTP स्थिति कोड क्यों बदलता है?
- 8. डिकंपलिंग कोड (भाषा स्वतंत्र)
- 9. जेवीएम प्लेटफॉर्म स्वतंत्र क्यों नहीं है, यह देखते हुए कि जावा (भाषा) मंच स्वतंत्र है?
- 10. यह सामान्य जावा कोड संकलित क्यों नहीं होगा?
- 11. यह कोड javac के साथ संकलित क्यों नहीं है लेकिन ग्रहण में कोई त्रुटि नहीं है?
- 12. क्यों .NET कोड MSIL को संकलित करता है?
- 13. अंतिम संपर्क हटा नहीं सकता - क्या स्थिति स्थिति कोड है?
- 14. फ़ीचर या बग: यह जावा कोड संकलित क्यों करता है?
- 15. क्यों 'कोड पर्याप्त सामान्य नहीं है'?
- 16. कोड विजुअल स्टूडियो 2010 में संकलित लेकिन सभी
- 17. निम्न कोड MSVC++ के साथ संकलित क्यों करता है?
- 18. ग्रहण क्यों संकलित करता है, लेकिन जावैक नहीं करता है?
- 19. क्यों --list.end() संकलित करता है?
- 20. यह कोड रूबी 1.9 पर क्यों संकलित नहीं है लेकिन रूबी 1.8 पर है?
- 21. एक डीबगर संलग्न होने पर फ्लाई पर संकलित सी # कोड क्यों काम नहीं करता है?
- 22. TileUpdater.Clear() सभी अपडेट क्यों नहीं हटाता है?
- 23. कोड की गुणवत्ता क्यों लोकप्रिय नहीं है?
- 24. यह संकलित क्यों करता है?
- 25. संकलित संकलक द्वारा संकलित कोड का प्रदर्शन
- 26. यह कोड वीएस -2010 में .NET 4.0 के साथ क्यों संकलित नहीं करता है?
- 27. नामित पैरामीटर का उपयोग करते समय यह सी # कोड संकलित क्यों नहीं होता है?
- 28. Response.Redirect HTTP स्थिति कोड
- 29. पर्ल में यह नक्शा कथन क्यों संकलित नहीं करता है?
- 30. रनटाइम से पहले संकलित नोड.जेएस क्यों नहीं है?
लेकिन वाह पूरी तरह से सही नहीं है। कई फ़ंक्शन कॉल और कूदता रिश्तेदार कूद का उपयोग करते हैं ताकि उन्हें चारों ओर स्थानांतरित होने के बाद भी एक जंप टेबल की आवश्यकता न हो। – Unknown
जेनरेट किए गए असेंबली कोड को देखते हुए ऐसा लगता है कि फ़ंक्शन का पता लोड किया गया है, जो कभी भी नहीं है, यह एक कूद है। क्या मैं आपके बयान को गलत समझ रहा हूं? – ojblass
@ojblass मेरा मतलब यह है कि कुछ कूद "0x400000 पर कूदने" के बजाय "यहां से 50 से अधिक निर्देशों को कूदें" या "5 निर्देशों को पीछे की ओर कूदें" जैसे हैं। तो कहने के लिए कि आपको हर बार एक पता लोड करना होगा -एफपीआईसी पूरी तरह से सच नहीं है। – Unknown