2010-11-11 10 views
10

-nostdlib का उपयोग करने और crt1.o -lc -lgcc को जोड़ने के अलावा, क्या जीसीसी को crtbegin[S].o और crtend[S].o से जोड़ने से रोकने का कोई आसान तरीका है? ये फ़ाइलें इतनी बड़ी नहीं हैं, लेकिन मैं छोटी बाइनरी बनाने के साथ खेल रहा हूं, और सी प्रोग्राम के लिए आवश्यक बेकार सी ++ समर्थन कोड को हटाना चाहता हूं। (संभवतः, जीसीसी उन्हें सी प्रोग्राम के लिए भी लिंक करता है यदि आप ग्लोबल ऑब्जेक्ट वैरिएबल के साथ सी ++ लाइब्रेरी का उपयोग कर रहे हैं। मैं हर किसी को इस बारे में बता दूंगा कि इसे सुरक्षित एक-बार प्रारंभिक कॉल कैसे बनाया जाना चाहिए, जहां वैश्विक वस्तु का संदर्भ दिया गया है बल्कि main करने से पहले वैश्विक वस्तुओं को प्रारंभ करने से सी ++ मॉड्यूल ...)क्या gcc omit crtbegin.o/crtend.o बनाने का कोई आसान तरीका है?

मैं सी ++ समर्थन में इस तरह के और इस तरह के पर सशर्त फ़ाइलों को जोड़ने बनाने के लिए जीसीसी specs फ़ाइल हैकिंग करने के लिए विरोध नहीं किया जाएगा, लेकिन मैं कर रहा हूँ यकीन नहीं है कि मैं यह कैसे करूंगा। शायद पहले से ही एक अच्छा तरीका है?

+0

मेरा मानना ​​है कि उन्हें '__attribute__ ((कन्स्ट्रक्टर))' (और 'विनाशक') कार्यों के लिए भी आवश्यक है। (और मैं एक सी ++ विशेषज्ञ से बहुत दूर हूं, लेकिन मुझे बताया गया है कि मानक के अनुरूप, वैश्विक रचनाकारों को 'मुख्य()' कहा जाता है।) – caf

+0

@caf: मैं इस धारणा के तहत था कि सी ++ मानक निर्दिष्ट करता है कि रचनाकारों को प्रोग्राम आमंत्रण के बीच अनिर्दिष्ट समय पर कॉल किया जाता है और पहली बार ऑब्जेक्ट का उपयोग किया जाता है (और निश्चित रूप से अनिर्दिष्ट क्रम में, उन मामलों से अलग जहां एक ऑब्जेक्ट दूसरे संदर्भित करता है और इस प्रकार "पहली बार इसका उपयोग किया जाता है") । क्या आपके पास इसके विपरीत संदर्भ है? –

+0

शायद एक "अंडा-चूसने वाला सिख", लेकिन क्या आपने वास्तविक लिंक चरण के लिए सीधे अपने सिस्टम लिंकर (शायद 'ld') पर संकलन करने और सीधे जाने के लिए 'gcc' का उपयोग करने का प्रयास किया है ताकि आपके लिंक पर अधिक नियंत्रण हो? –

उत्तर

6
gcc -wrapper sh,-c,'z= ; for i ; do [ "$z" ] || set -- ; z=1 ; 
    case "$i" in *crtbegin*.o|*crtend*.o) ;; *) set -- "[email protected]" "$i" ;; esac ; 
    done ; exec "$0" "[email protected]"' 
+1

क्या कोई उपर्युक्त लिपि में क्या हो रहा है समझा सकता है? –

+0

@ 4aRkKn1gh7: '-प्रैपर' विकल्प जीसीसी को बाहरी आदेशों का आह्वान करने के लिए मिलता है जो इसे एक रैपर प्रोग्राम के माध्यम से चलाता है। रैपर प्रोग्राम एक शेल स्क्रिप्ट है जो अनुरोधित आदेश का आह्वान करने से पहले '* crtbegin * .o' या' * crtend * .o' से मेल खाने वाले किसी भी तर्क को छोड़ देता है। यह स्क्रिप्ट को फ़ाइल में सहेजने के बजाय कमांड लाइन पर सिर्फ इनलाइन लिखा गया है। –

3

मुझे लगता है कि आपको -nostartfiles विकल्प चाहिए। वैसे भी मुझे एम्बेडेड सामान के लिए वैसे भी चाहिए।

+1

यह एक अच्छी शुरुआत है (कोई इरादा नहीं है), लेकिन यह 'crt1.o' को भी छोड़ देता है जिसमें' _start' प्रविष्टि बिंदु होता है। –

+0

@ आर ..: मुझे यकीन है कि आप लिंकर स्क्रिप्ट में एंटरपॉइंट स्थापित कर सकते हैं। – leppie

+0

हां, मुझे पता है कि मैं ऐसा कर सकता हूं, लेकिन यह 'crt1.o' के पथ को खोजने और लिंक करने के लिए 'gcc' कमांड लाइन का उपयोग करने से बहुत खराब है। असल में मैं अनावश्यक सामानों में लिंक न करने के लिए जीसीसी प्राप्त करने के लिए पोर्टेबल तरीके से निकटतम चीज़ की तलाश में था, और जवाब ऐसा लगता है कि कोई भी नहीं है। –

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

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