2009-07-22 11 views
10

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

+0

ऐसा लगता है कि जीसीसी 7 को अब -पीपीआईसी के साथ संकलित सबकुछ की आवश्यकता है। कम से कम मुझे एन त्रुटि मिलती है और मुझे यह सवाल मिल गया कि मुझे त्रुटि क्यों मिलती है? – Lothar

+0

@ लोथर नहीं, इसे सामान्य रूप से इसकी आवश्यकता नहीं है। क्या आप '-एफपीआईसी' के साथ और बिना संकलित वस्तुओं को मिला रहे हैं? – ephemient

उत्तर

9

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

आगे बढ़ना, स्थिति-स्वतंत्र निष्पादन योग्य (-fPIE) केवल स्थिति-स्वतंत्र कोड से निर्मित करना भी संभव है।

कहा जा रहा है कि, libtool आपके द्वारा संकलित प्रत्येक स्रोत फ़ाइल के लिए स्वचालित रूप से पीआईसी और गैर-पीआईसी ऑब्जेक्ट्स दोनों का उत्पादन कर सकता है, और इसे बिना किसी निर्माण प्रणाली में libtol एकीकरण के बिना भी करना आसान होना चाहिए।

+0

कोई पीआईसी x86 पर एक रजिस्टर नहीं लेता है। इस सीपीयू में स्थिति अप्रत्यक्ष कोड नहीं है और इसलिए हमेशा डेटा/कार्यों में एक संकेत जोड़ता है। आप पूरी तरह से x86 पर -fPIC के बारे में भूल सकते हैं क्योंकि यदि आप इसे निर्दिष्ट नहीं करते हैं तो आपको तेज़ कोड मिलता है और लिंकर प्रत्येक निष्पादन योग्य के लिए कोड सेगमेंट को डुप्लिकेट करता है। – Lothar

+0

@ लोथर x86-32 पर, कंपाइलर के आधार पर, पीआईसी एक रजिस्टर ले लेता है। 5.0 आरक्षित से पहले जीसीसी '% ईबीएक्स', जो सामान्य उपयोग के लिए उपलब्ध नहीं है। https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54232 – ephemient

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

  • कोई संबंधित समस्या नहीं^_^