2012-04-12 14 views
9

-nostdlib के साथ संकलन/लिंकिंग स्थिर प्रारंभिकता को रोकने के लिए प्रतीत होता है, भले ही मैं अपना खुद का crti.s और crtn.s .init/.fini अनुभागों के साथ जोड़ूं।जी ++, स्थैतिक प्रारंभिकरण और -nostdlib

क्या जी ++ स्थिर प्रारंभिक कोड उत्पन्न करने के लिए कामकाज है जो .init में डाला गया है या मैं मैन्युअल रूप से कॉल कर सकता हूं?

यह है कि मैं क्या करने की कोशिश की है:

g++ -o test.o -c -fno-use-cxa-atexit test.cc # has _start (entry point) 
               # that calls _init and _main 
as -o crti.o crti.s  # has _init in section .init 
as -o crtn.o crtn.s 
g++ -o test ./crti.o test.o -nodefaultlibs -nostartfiles ./crtn.o 

-nodefaultlibs अकेले स्थिर प्रवर्तन कोड भी शामिल है और कहते हैं, लेकिन libc-_start/_init की ताकतों उपयोग।

-nodefaultlibs -nostartfiles मुझे अपने स्वयं के _start/_init का उपयोग करने की अनुमति देता है, लेकिन इसमें स्थिर प्रारंभिक कोड या कोड शामिल नहीं है।

+0

प्रयास करें इस 'जी ++ -ओ परीक्षण ./crti.o ./crtn.o test.o -Wl, -nostartfiles' और अपने उपयोग को देख -nodefaultlibs मैं आपको लगता है केवल अपनी स्टार्टअप फ़ाइलों को शामिल करना चाहते हैं और आप मानक पुस्तकालय से अन्य libs के साथ ठीक लग रहे हैं? –

+0

@ पवन: मैंने '-Wl, -nodefaultlibs -Wl, -nostartfiles' की कोशिश की, लेकिन फिर libc-_init संकलक द्वारा शामिल किया गया है। उपयोग आईबीएम सेल एसपीयू के लिए है - मुझे सब कुछ सेट अप करने के लिए अपना खुद का स्टार्टअप कोड चाहिए और libc फ़ंक्शंस का उपयोग न करें, लेकिन अभी भी कॉल करने के लिए स्थिर रचनाकारों की आवश्यकता है। – Thomas

+0

मुझे सी ++ में अच्छी तरह से पता नहीं है, इसलिए मुझे इसका मतलब नहीं मिल रहा है "लेकिन अभी भी स्थिर रचनाकारों को बुलाए जाने की आवश्यकता है"? क्या आप मुझे कुछ उदाहरण बता सकते हैं। मैं हर समय स्थिर libs सोच रहा था –

उत्तर

9
gcc linker docs से

,

-nostdlib

मानक सिस्टम स्टार्टअप फ़ाइलों या पुस्तकालयों जब जोड़ने का प्रयोग न करें। कोई स्टार्टअप फ़ाइलों और केवल पुस्तकालयों आप लिंकर के लिए पारित किया जाएगा निर्दिष्ट करें, और विकल्पों प्रणाली के संबंध को निर्दिष्ट इस तरह के स्थैतिक-libgcc या कमरा साझा-libgcc रूप पुस्तकालयों,, ध्यान नहीं दिया जाता।

इसलिए का उपयोग करें,

-nodefaultlibs

जब जोड़ने मानक प्रणाली पुस्तकालयों का उपयोग न करें। केवल आपके द्वारा निर्दिष्ट पुस्तकालयों को लिंकर पर भेजा जाएगा, सिस्टम लाइब्रेरीज़ जैसे -स्टैटिक-libgcc या -shared-libgcc के लिंक को निर्दिष्ट करने वाले विकल्प को अनदेखा कर दिया जाएगा। मानक स्टार्टअप फ़ाइलों का सामान्य रूप से उपयोग किया जाता है, जब तक- नोस्टार्टफाइल का उपयोग नहीं किया जाता है। कंपाइलर memcmp, memset, memcpy और memmove को कॉल जेनरेट कर सकता है। इन प्रविष्टियों को आमतौर पर libc में प्रविष्टियों द्वारा हल किया जाता है। जब यह विकल्प निर्दिष्ट होता है तो इन प्रविष्टि बिंदुओं को किसी अन्य तंत्र के माध्यम से आपूर्ति की जानी चाहिए।

भी कोशिश,

g++ -Wl, -static 

-Wl  passes the next command on to the linker 
-static On systems that support dynamic linking, this prevents linking with 
     the shared libraries. On other systems, this option has no effect. 
+0

इससे बहुत मदद मिली, धन्यवाद। – Thomas

+0

स्थिर अंतर्निहितता के लिए कोड को -nodefaultlibs के साथ शामिल किया गया है और कहा जाता है, लेकिन फिर मुझे अपना खुद का .init/_start कोड का उपयोग करने का कोई तरीका नहीं दिखता है। क्या यह अभी भी संभव है? – Thomas

+0

क्या आपने '-nostartfiles' का उपयोग किया था? –