सभी कोड संकलित स्थिति स्वतंत्र क्यों नहीं है?


85

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


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

उत्पन्न असेंबली कोड को देखकर ऐसा प्रतीत होता है कि फ़ंक्शन का पता व्हाट्सएप गैर fpic कोड लोड किया गया है ऐसा प्रतीत होता है कि यह केवल एक छलांग है। क्या मैं आपके कथन को गलत समझ रहा हूं?
ओब्लास

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

विकिपीडिया लेख एक अच्छा विवरण प्रदान करता है। मूल रूप से, कुछ आर्किटेक्चर पर किसी रिश्तेदार के पते पर कूदने का कोई सीधा तरीका नहीं है। इसलिए, PIC उन मेहराबों पर उपयोग करने के लिए अधिक महंगा है। अधिक जानकारी के लिए @ EvanTeran का उत्तर देखें।
अलेक्सई शोलिक २५'१३

जवाबों:


67

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


33

यह आलेख बताता है कि PIC कैसे काम करता है और इसकी तुलना वैकल्पिक लोड लोड स्थानांतरण से करता है । मुझे लगता है कि यह आपके प्रश्न के लिए प्रासंगिक है।


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

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

10
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं।
रोब

4
@ रब: उत्पादक चीज को संपादित करने के लिए सुझाव देना होगा और श्वेत के लिए टिप्पणियों का उपयोग नहीं करना चाहिए। यह उत्तर 4 साल पुराना है। इसके बाद एसओ के पास इस बारे में कम कड़े नियम थे कि एक उत्तर कैसे दिखना चाहिए
एली बेंडरस्की

6
इस पोस्ट ने "समीक्षा" के तहत दिखाया कि मैं ऐसा करता हूं और मैंने किया। किसी और ने इसे हरी झंडी दिखाई। "टिप्पणी" एसओ द्वारा निर्मित ऑटो है, न कि मैं।
रोब

27

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

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

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


23

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

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

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

x86-64 ने "RIP रिलेटिव" मोड जोड़ा, जो चीजों को बहुत सरल बनाता है।


1
IIRC MIPS में पीसी-रिलेटिव एड्रेसिंग भी नहीं है, सिवाय रिलेटिव
जंपर्स के

1
यह एक सामान्य तकनीक है जिसका उपयोग शेलकोड में उस पते को प्राप्त करने के लिए किया जाता है जिसे यह निष्पादित कर रहा है। मैंने कुछ CTF समाधानों में इसका उपयोग किया है।
शेरेल्बेक

2

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

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

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


1

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


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

1

position-independent code अधिकांश आर्किटेक्चर पर एक प्रदर्शन ओवरहेड है, क्योंकि इसके लिए एक अतिरिक्त रजिस्टर की आवश्यकता होती है।

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


0

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


-5

2009 के लिए प्रश्न दिनांक। दस साल बीत चुके हैं, और अब सभी कोड वास्तव में स्वतंत्र स्थिति है। यह अब ऑपरेटिंग सिस्टम और कंपाइलर द्वारा लागू किया गया है। ऑप्ट-आउट करने का कोई तरीका नहीं है। सभी कोड को PIE के साथ बल-संकलित किया गया है, और-AS-R बहाने के हिस्से के रूप में -no-pic / -no-ध्वज ध्वज को अनदेखा किया जा रहा है। इसका कारण बढ़ी सुरक्षा की आड़ में पूर्व के तेज़ ऐप को धीमा करना और नए हार्डवेयर को बेचना है। यह पूरी तरह से तर्कहीन है, क्योंकि अब बड़े मेमोरी साइज हमें सभी ऐप्स को स्टेटिक रूप से कंपेयर करते हुए डायनेमिक लिंकिंग के नर्क से छुटकारा दिलाते हैं।

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

आप शिकायत नहीं करते हैं, क्योंकि आप यह भी नहीं जानते हैं कि आपके कोड को इन सभी प्रशिक्षण पहियों द्वारा विकलांग किया जा रहा है। मैं क्या कह सकता हूँ? अब उनके PIC के साथ 2 बार धीमी गति से सॉफ्टवेयर का आनंद लें! इससे भी अधिक, LLVM के आगमन के साथ, जल्द ही वहाँ JIT (प्रबंधित कोड) लागू किया जाएगा, जिसमें x86 इनलाइन असेंबली का उपयोग नहीं होगा, जो किसी भी C / C ++ कोड को और धीमा कर देगा। "जो लोग सुरक्षा के लिए स्वतंत्रता का त्याग करते हैं वे न तो योग्य हैं।"


यह सिर्फ तथ्यों का एक बयान है: 10 साल पहले PIC वैकल्पिक था, लेकिन आज यह डिफ़ॉल्ट और अनिवार्य है। मुझे लगता है कि गैर-पाई कोड को आगे के ओएस रिलीज़ में समर्थित किया जाएगा। जैसे विंडोज 9x के बाद रियल मोड सपोर्ट को गिरा दिया गया था। तो PIC का उपयोग करने या न करने का प्रश्न एक सैद्धांतिक कंप्यूटर विज्ञान विषय का अधिक हो जाता है, जब तक कि आप किसी तरह अपने ओएस को अनलॉक न करें और इसके लिए समर्थन को फिर से सक्षम न करें। लोगों को PIC के बारे में जानने के लिए सबसे महत्वपूर्ण बात यह है कि यह काफी धीमा है जो अब तक संकलित स्थैतिक संकलन का समर्थन करता है, और अधिकांश DLL के स्थिर संस्करण थे।
स्मग्लिस्पेविनी

1
आपके पहले दो वाक्य केवल तथ्यों का विवरण हैं। बाकी की राय, साजिश पर आधारित है।
मिच लिंडग्रेन

ठीक है, बस लोगों के साथ बात करें, इस पर उनकी राय पूछें। मैंने व्यक्तिगत रूप से पाया कि PIC बनाम गैर-PIC भी विचारधारा का प्रश्न बन गए थे। PIC कम्युनिज्म के प्रोग्रामिंग समतुल्य है, जहाँ कोड का बड़े पैमाने पर उत्पादन किया जाता है और सभी को समान कॉपी मिलती है। नॉन-पीआईसी कैपिटलिज्म के बराबर एक प्रोग्रामिंग है, जहां एक ही कोड के कई प्रतिस्पर्धी संस्करण हैं। तो अधिक वामपंथी मानसिकता वाले लोग अवचेतन रूप से इस बात को साबित करने के लिए PIC का समर्थन करते हैं कि उनकी पसंदीदा विचारधारा कम से कम कंप्यूटिंग में काम कर सकती है। ये वही लोग आपको व्यक्तिगत रूप से संशोधित libpng का उपयोग करने के खिलाफ कहने की सलाह देंगे।
स्मग्लिस्पेविनवी

2
क्या हम एक प्रोग्रामिंग वेबसाइट पर राजनीतिक किराए नहीं दे सकते हैं कृपया धन्यवाद
रेयान मैककंपबेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.