2013-02-26 186 views
5

के साथ वस्तु फ़ाइलें साझा एक परियोजना है, जो दो लिनक्स कर्नेल मॉड्यूल का निर्माण करने की जरूरत है कल्पना कीजिए सूत्रों के पेड़ के निम्नलिखित लेआउट के साथ,:बिल्डिंग एक बाहर के पेड़ लिनक्स कर्नेल मॉड्यूल जो निर्यात प्रतीकों

modules/ 
|--common/ 
| `--common_data.c 
|--mod1/ 
| `--mod1_main.c 
`--mod2/ 
    `--mod2_main.c 

common_data .o ऑब्जेक्ट फ़ाइल को दोनों मॉड्यूल में शामिल करने की आवश्यकता है। तो इस परियोजना के लिए Kbuild फ़ाइल कुछ इस तरह दिखता है:

obj-m := mod1.o mod2.o 
mod1-y := mod1/mod1_main.o common/common_data.o 
mod2-y := mod2/mod2_main.o common/common_data.o 

यह ठीक बनाता है, अगर वहाँ नहीं निर्यात प्रतीकों (अर्थात EXPORT_SYMBOL) common_data.c फ़ाइल में।

WARNING: mod2: 'some_func' exported twice. Previous export was in mod1.ko 

इसका कारण यह है दोनों मॉड्यूल का हिस्सा एकल Module.symvers फ़ाइल: लेकिन, अगर वहाँ कुछ निर्यात प्रतीकों (जैसे some_func) कर रहे हैं, तो MODPOST तरह चेतावनी का उत्पादन करेगा। इस चेतावनी से बचने के लिए mod1/और mod2/निर्देशिकाओं में दो अलग-अलग Kbuild फ़ाइलों को बनाना संभव है, क्योंकि तब दो अलग Module.symvers फ़ाइलें होंगी। लेकिन इससे एक और मुद्दा सामने आएगा - commond_data.o ऑब्जेक्ट दो बार बनाया जाएगा - mod2.ko संकलित करते समय mod1.ko और दूसरी बार संकलित करते समय पहली बार।

क्या एकल कुबिल फ़ाइल का उपयोग करते समय या चेतावनी को दबाने के किसी भी तरीके हैं क्या दो अलग-अलग Kbuild फ़ाइलों का उपयोग करते समय common_data.o फ़ाइल के दूसरे पुनर्निर्माण को रोकने के लिए?

+2

यदि दोनों मॉड्यूल एक ही प्रतीक नाम निर्यात करते हैं, तो यह संभव नहीं एक समय में कर्नेल में दोनों मॉड्यूल डालने के लिए किया जाएगा। क्या तुम यही चाहते हो? आम तौर पर, सामान्य कार्यक्षमता, जैसे आपका निर्यात किया गया प्रतीक, अपने मॉड्यूल में लगाया जाएगा। –

+0

हां, मुझे पता है कि एक ही समय में उन्हें सम्मिलित करना संभव नहीं होगा, लेकिन इसकी आवश्यकता नहीं है। मेरे मामले में mod1 और mod2 जानबूझकर इस तरह से डिजाइन किए गए हैं। असल में, mod2 एक ही mod1 मॉड्यूल है, लेकिन कुछ अतिरिक्त कार्यक्षमता (उदा। इकाई परीक्षण) के साथ। –

+0

@ ऑस्टिन फिलिप्स मैं एक ही स्थिति में हूं, लेकिन मुझे समझने के बिना संदेशों को अनदेखा करने में थोड़ा संकोच नहीं है कि वे क्यों होते हैं। क्या चेतावनी संदेश पूरी तरह से चेतावनी देता है (यानी आपको चेतावनी देने के लिए कि केवल इन मॉड्यूल में से एक ही लोड हो सकता है)? –

उत्तर

0

कुछ Kbuild प्रणाली को संवारता मैं निष्कर्ष है कि इस तरह से स्थिति से निपटने के लिए एक सबसे सरल तरीका है, को फ़िल्टर आउट करने के लिए make उत्पादन से चेतावनी संदेश बाहरी makefile में है के साथ समाप्त हो गया के बाद:

$(MAKE) -C $(KDIR) M=$$PWD 2>&1 \ 
| grep -v '^WARNING:.*exported twice\. Previous export was in' 

या w/ओ STDERR त्याग और STDOUT में कुचलने, लेकिन यह bash की आवश्यकता है:

bash -c "$(MAKE) -C $(KDIR) M=$$PWD 2> >(grep -v '^WARNING:.*exported twice\. Previous export was in')"