2013-04-11 7 views
7

के साथ प्रारंभ करना तो थोड़ी देर के लिए वेब खोजने के बाद, मैंने यहां कोशिश करने का फैसला किया क्योंकि यह चर्चा के लिए एक अच्छा मंच प्रतीत होता है। मैं एक साधारण जीसीसी प्लगइन बनाने की कोशिश कर रहा हूँ। कार्यक्रम कोड इस मेल के अंत में संलग्न है, लेकिन सादे अंग्रेजी में यह प्लगइन पंजीकृत करता है और यह सुनिश्चित करता है कि pragma_init फ़ंक्शन को प्रिमामा पंजीकृत होने पर कहा जाता है। यह यहां है कि मैं कुछ pragmas को रोकने के लिए c_register_pragma का उपयोग करता हूं।जीसीसी प्लगइन्स

मैं इसे http://gcc.gnu.org/onlinedocs/gccint/Plugins-building.html#Plugins-building में उदाहरण का उपयोग करके संकलित करता हूं। संकलन और लिंकिंग ठीक काम करता है। हालांकि, जब मैं प्लग-इन लोड करता हूं तो मुझे मिलता है:

gcc -c -fplugin=plugin.so test.c -o test.o 

cc1: error: cannot load plugin plugin.so 

plugin.so: undefined symbol: warning 

मैं क्या गलत कर रहा हूं? इसके अतिरिक्त, जब कुछ हेडर फ़ाइलों (बाद में इसकी आवश्यकता होगी) सहित, मुझे बहुत सारी त्रुटियां मिलती हैं। "Tree.h" पैदावार (50 अन्य त्रुटियों के बीच) सहित उदाहरण के लिए, के लिए:

/machmode.h:262:1: error: unknown type name 'class' 

class bit_field_mode_iterator 
^ 
/machmode.h:263:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token 

{ 
^ 
/plugin/include/tree.h:27:0, 
      from conftest.c:63: 

/vec.h:220:8: error: field 'register_overhead' declared as a function 

किसी को भी मैं गलत क्या कर रहा हूँ पर एक सुराग नहीं है?

धन्यवाद

+0

आप http उपयोग करने पर विचार किया था जी के साथ ++ जीसीसी के बजाय संकलन

त्रुटियों आप शामिल में सभी फाइलों के साथ मिल गया के सैकड़ों अपने कंप्यूटर में हल कर रहे हैं -melt.org/ जो सीई ++ में जीसीसी प्लगइन बनाने के बजाय एमईएलटी (जीसीसी का विस्तार करने के लिए एक डोमेन विशिष्ट भाषा) में आपके जीसीसी एक्सटेंशन को कोड कर रहा है? –

+0

'gcc -v' का आउटपुट क्या है? –

+0

-v (तब प्लगइन संकलित करते समय) का आउटपुट है: collect2 --eh-frame-hdr -m elf_x86_64 -shared -o plugin.so /lib/../lib64/crti.o/gcc-48/lib/जीसीसी/x86_64-अज्ञात-लिनक्स-gnu/4.8.0/crtbeginS.o -L/gcc-48/lib/gcc/x86_64-अज्ञात-लिनक्स-gnu/4.8.0 -L/gcc-48/lib/gcc/x86_64-अज्ञात-लिनक्स-gnu/4.8.0 /../../../../ lib64 -L/lib /../ lib64 -L/usr/lib /../ lib64 -L/gcc- 48/lib/gcc/x86_64-अज्ञात-लिनक्स-gnu/4.8.0 /../../ .. plugin.o -lgcc --as-required -lgcc_s --no-as-required -lc -lgcc - -as-required -lgcc_s --no-as-required /gcc-48/lib/gcc/x86_64- अज्ञात-linux-gnu/4.8.0/crtendS.o /lib/../lib64/crtn.o – llubder

उत्तर

2

जीसीसी का कौन सा संस्करण उपयोग कर रहे हैं, दोनों अपने प्लगइन संकलित करने के लिए, और प्लगइन का उपयोग करने के लिए? बस

gcc -v 

किसी अन्य प्रोग्राम तर्क के बिना पता लगाने के लिए चलाएं!

आप जीसीसी प्लगइन विकास के लिए उचित पैकेज स्थापित किया था (Debian या Ubuntu पर, यह gcc-4.7-plugin-dev हो सकता है, लेकिन जीसीसी के अपने विशेष संस्करण से 4.7 संस्करण अनुकूलन)?

क्या आपने अपना जीसीसी बनाने के लिए आवश्यक सभी निर्भरताओं को स्थापित किया था (डेबियन या उबंटू, apt-get build-dep gcc-4.7 gcc-4.7-plugin-dev पर)?

जीसीसी के हाल के संस्करण (विशेष रूप से वितरण द्वारा भेजे गए कई जीसीसी 4.7, और सभी जीसीसी 4.8) को सी ++ कंपाइलर द्वारा संकलित किया गया है, सी संकलक नहीं।

आप

nm -D -C $(gcc -print-file-name=cc1) 

चल रहा है कि आदेश से पता चलता है सी ++ लिख दिया, तो द्वारा कैसे किया गया था अपने जीसीसी (C++ में या सी में) बनाया जाँच कर सकते हैं manged नाम, उदा बस execute_ipa_pass_list अपने जीसीसी के बजाय execute_ipa_pass_list(opt_pass*) एक सी ++ संकलक के साथ संकलित किया गया है (शायद g++)

तो तुम g++ (नहीं gcc) अपने जीसीसी प्लगइन संकलित करने के लिए उपयोग करने की आवश्यकता हो सकती है।

जैसा कि मैंने टिप्पणी की थी, क्या आपने MELT (जीसीसी का विस्तार करने के लिए एक डोमेन विशिष्ट भाषा) का उपयोग करने पर विचार किया है ताकि आप gcc कंपाइलर को विस्तार या अनुकूलित कर सकें?

मैं के बाद से मैं 4.8

जीसीसी 4.7 के लिए कुछ ही हफ्तों में अगले पिघल जारी करेंगे और और एक के साथ अपने जीसीसी के पार्स करने व्यवहार को बदलने के लिए उम्मीद नहीं है बहुत नवीनतम http://gcc-melt.org/melt-plugin-snapshot.tar.bz2 डाउनलोड करने का सुझाव लगाना। यह वास्तव में संभव नहीं है (जीसीसी पार्स किए गए सिंटैक्स को विस्तारित न करने के लिए केवल आपके प्लगइन और प्रागमा जोड़ने के लिए प्लगइन हुक प्रदान करता है)।

+0

COLLECT_GCC = जीसीसी COLLECT_LTO_WRAPPER =/घर/आरबी/उपकरण/जीसीसी-48/libexec/जीसीसी/x86_64-अज्ञात-linux-जीएनयू/4.8.0/LTO-आवरण लक्ष्य: x86_64-अज्ञात-linux-gnu साथ कॉन्फ़िगर : ../gcc-4.8.0/configure --prefix =/home/rb/tools/gcc-48 --disable-multilib थ्रेड मॉडल: पॉज़िक्स जीसीसी संस्करण 4.8.0 (जीसीसी) – llubder

+0

धन्यवाद बेसिल। मैंने प्लगइन-डीवी पैकेज स्थापित किया (एफसी 17 का उपयोग करके) और अब प्लगइन लोड हो गया है और सही संदेश आउटपुट कर रहा है। हालांकि, मैं अपने कंपाइलर पर वापस लौटा जो सिस्टम पर पूर्व-स्थापित था। क्या मुझे जीसीसी 4.8 का उपयोग करने के लिए अतिरिक्त सावधानी बरतनी है? शायद मैं कुछ झंडे याद कर रहा हूँ। फिर भी, ऐसा लगता है कि प्रीबिल्ड 4.7 के साथ कम से कम काम करता है। फिर, समर्थन के लिए धन्यवाद। – llubder

+0

जिज्ञासा से, आप किस प्रकार की जीसीसी प्लगइन विकसित करना चाहते हैं? –

3

यहां दो समस्याएं हैं:

त्रुटि: "लोड नहीं कर सकता प्लगइन plugin.so" मतलब है कि आप जहाँ आप अपने नए साझा लाइब्रेरी प्लगइन की दुकान अपने LD_LIBRARY_PATH के लिए निर्देशिका जोड़ना चाहिए। // जीसीसी: यदि आप (समझने के लिए क्यों सोचा यकीन नहीं)

+0

जीसीसी के अंतिम संस्करणों में, प्लग-इन केवल g ++ के साथ काम करता है –

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