2012-08-13 23 views
6

में मॉड्यूल के लिए लाइसेंस सेट करना मैंने एडा में कुछ कर्नेल मॉड्यूल लिखे हैं, और मैंने कुछ समस्याएं आई हैं। लाइसेंस को एक सी मैक्रो के रूप में परिभाषित किया गया है, और मैं वास्तव में यह नहीं कर सकता कि यह वास्तव में क्या है। क्या यह सी के सभी कार्यों को फिर से निर्यात करने के लिए एक उपयुक्त समाधान है, जिसके लिए जीपीएल की आवश्यकता होती है यदि सी और एडीए मॉड्यूल दोनों में जीपीएल संगत लाइसेंस हैं? क्या ऐसा करने के लिए इससे अच्छा तरीका है?लिनक्स कर्नेल

उत्तर

6

सी मैक्रोज़ से निपटना एक शाही पिटा है। मेरे पास एक सपना है कि एक दिन सी प्रोग्रामर दुनिया के बाकी हिस्सों को एक पक्ष करेंगे और उनका उपयोग छोड़ देंगे।

यदि यह मैं था, तो मै मैक्रो को यह देखने के लिए चलाता हूं कि यह क्या आउटपुट करता है, फिर समकक्ष आउटपुट के लिए कुछ एडीए कोड लिखें।

रोलैंड के उत्तर के माध्यम से पढ़ने से, यह मुझे लगता है कि कार्यान्वयन-परिभाषित pragma linker_section की आवश्यकता हो सकती है।

pragma Linker_Section ([इकाई =>] LOCAL_NAME, [धारा =>] static_string_EXPRESSION);

LOCAL_NAME को लाइब्रेरी स्तर पर घोषित ऑब्जेक्ट का संदर्भ लेना चाहिए। यह प्रगति दी गई इकाई के लिए लिंकर अनुभाग का नाम निर्दिष्ट करती है। यह जीएनयू सी में __attribute__((section)) के बराबर है और निष्पादन योग्य के static_string_EXPRESSION अनुभाग में LOCAL_NAME को रखा जा सकता है (माना जाता है कि लिंकर अनुभाग का नाम नहीं बदलता है)।

5

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

किसी भी मामले में, मॉड्यूल लाइसेंस .ko फ़ाइल के .modinfo खंड में "लाइसेंस = जीपीएल" की तरह एक स्ट्रिंग है। सी कोड में, यह __MODULE_INFO() मैक्रो द्वारा <linux/moduleparam.h> से बनाया गया है, जो char की एक सरणी बनाता है जो उपरोक्त स्ट्रिंग पर सेट है, __attribute__((section(".modinfo"))) के साथ टैग किया गया है।

मुझे लगता है कि शायद एडा में ऐसा करने के कुछ समान तरीके हैं; यदि नहीं, सबसे बुरे मामले में, एक लिंकर स्क्रिप्ट के साथ करना संभव होना चाहिए। संभवतः, आपके पास पहले से ही इसे संभालने का कोई तरीका है, modinfo अनुभाग के "vermagic = XXX" भाग को सेट करने के लिए।

+0

प्रश्न मजाक क्यों होगा? मैं केवल हर दूसरी बाधा के लिए भी तैयार था; मैं ईमानदारी से यह एक असली मुद्दा होने की उम्मीद नहीं की थी। – Probie

+0

क्योंकि 1) यदि आप केवल सी और 2 में अपना मॉड्यूल लिखते हैं तो यह वास्तव में बहुत आसान है) यह आश्चर्यजनक है कि आप बाकी सब कुछ हल करने में सक्षम थे, मुझे यकीन है कि आप हिट करते हैं और फिर जटिल नहीं होने के बाद अटक जाते हैं MODULE_LICENSE() मैक्रो का विस्तार। – Roland

+2

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

1

जैसा कि आप शायद जीएनएटी का उपयोग कर रहे हैं, आप pragma License का उपयोग कर सकते हैं "मानक और संशोधित जीपीएल के संबंध में उचित लाइसेंस शर्तों के लिए स्वचालित जांच की अनुमति देने के लिए।"

+0

नहीं, यह काम नहीं करता है। – Probie

+0

किस तरह से "काम नहीं करता"? –

+0

@Probie: मुझे लगता है कि आपका क्या मतलब है; यह केवल संगतता की जांच करता है, लेकिन यह टी.ई.डी. के [सुझाव] (http://stackoverflow.com/a/11936532/230513) का पूरक हो सकता है। – trashgod

3

समस्या sidestepping के लिए एक दृष्टिकोण के रूप में, आप सी में लाइसेंस हिस्सा छोड़ने के लिए और Annex B का इस्तेमाल कर सकता (अन्य भाषाओं के साथ Interfacing) इसे उपयोग करने की सुविधा है?

इसमें कम से कम समस्या होनी चाहिए, और आपको अन्य मॉड्यूल के साथ आगे बढ़ने की अनुमति मिलती है।

सबसे अच्छा यह आपको एडा में जांच करने की अनुमति दे सकता है, लाइसेंस कैसा दिखता है और इस तरह से इंजीनियर को उलट देता है।

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