2010-07-19 16 views
21

संकलित करें मैं एक निष्पादन योग्य (ईएलएफ फ़ाइल) संकलित करने की कोशिश कर रहा हूं जो गतिशील लोडर का उपयोग नहीं करता है। मैंने एक क्रॉस कंपाइलर बनाया जो मैंने बनाया सिम्युलेटर पर लिनक्स से मिप्स को संकलित करता है। मैंने अपने hello.cpp फ़ाइल (हैलो वर्ल्ड प्रोग्राम) के संकलन पर ध्वज-स्टेटिक-libgcc जोर दिया। जाहिर है यह हालांकि पर्याप्त नहीं है। क्योंकि मेरे निष्पादन योग्य में अभी भी एक सेगमेंट है जिसमें गतिशील लोडर का नाम/पथ शामिल है। निष्पादन योग्य उत्पन्न करने के लिए मैं किस झंडे का उपयोग करता हूं जिसमें चलाने के लिए आवश्यक सब कुछ शामिल है? क्या मुझे अपने क्रॉस कंपाइलर का पुनर्निर्माण करने की ज़रूरत है?एक स्टैंडअलोन स्टेटिक निष्पादन योग्य

उत्तर

12

-static ध्वज का उपयोग करने का प्रयास करें?

+0

क्या कोई अच्छा संसाधन वर्णन निष्पादित कर सकता है प्रत्येक जीसीसी झंडे के सटीक परिणाम में? मैं 100% निश्चित नहीं हूं कि मैं वास्तव में गतिशील लोडिंग अक्षम कर रहा हूं या नहीं। जब मैं -स्टैटिक का उपयोग करता हूं तब भी मेरे पास एक गतिशील लोडर का नाम होता है जो elf फ़ाइल के मेरे .interp खंड में रखा जाता है। –

+0

http://gcc.gnu.org/onlinedocs/gcc/Option-Index.html मैं एक ऑपरेटिंग सिस्टम लिखता था जो एल्फ़ एक्जिक्यूटिव लोड करता है और मैं पुष्टि कर सकता हूं कि -स्टैटिक ध्वज काम करता है, बस एलडी से संबंधित सामानों को अनदेखा करें और निष्पादन योग्य प्रविष्टि बिंदु पर सीधे कूदें – Tomaka17

+0

मैंने कुछ कॉन्फ़िगरेशन विकल्प "-डिसेबल-साझा" का उपयोग करने के बारे में कुछ पढ़ा है। क्या एक स्टैंडअलोन निष्पादन योग्य संकलन करना आवश्यक नहीं है? –

61

जोड़ने

-static -static-libgcc -static-libstdc++ 

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

जांच करें कि यह वास्तव में काम किया

  1. यकीन है कि वास्तव में कोई गतिशील संबंध

    ldd yourexecutable 
    

    लौटना चाहिए "एक गतिशील निष्पादन योग्य नहीं" या कुछ बराबर है कि वहाँ बनाओ।

  2. सुनिश्चित करें कि कोई अनसुलझे प्रतीकों छोड़ दिया

    nm yourexecutable | grep " U " 
    

    सूची खाली होना चाहिए या

    केवल कुछ विशेष कर्नेल-स्थान प्रतीकों की तरह
    U __tls_get_addr 
    
  3. अंत में शामिल करना चाहिए, अगर आप की जाँच देखते हैं कि बनाओ वास्तव में आपके निष्पादन योग्य

+2

यह स्वीकार्य उत्तर होना चाहिए! –

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