2012-02-29 7 views
8

मेरे पास दो कर्नेल मॉड्यूल हैं (मोडए और मोडबी कहते हैं)। मोडए EXPORT_SYMBOL(symA) के साथ एक प्रतीक निर्यात करता है और मोडबी इसका उपयोग करता है। मैं मोडा के लिए शीर्ष लेख modA.h है:निर्यात किए गए प्रतीकों का उपयोग करने वाले कर्नेल मॉड्यूल को चेतावनी

... 
extern void symA(int param); 
... 

और modB.c में:

#include "modA.h" 
... 
static int __init modB_init(void) 
{ 
    symA(10); 
} 
... 

मैं insmod modB सब ठीक काम करता है, तो मेरे modB सही ढंग से कर्नेल में जुड़ा हुआ है और समारोह symA सही ढंग से कहा जाता है। हालांकि जब मैं मॉडब बनाता हूं तो संकलक एक चेतावनी उठाता है: symA is undefined। एक एलकेएम एक ईएलएफ स्थानांतरित करने योग्य है तो संकलक इस चेतावनी को क्यों उठाता है? इसे कैसे हटाया जा सकता है?

उत्तर

12

यह समस्या (और कैसे इस मामले में सही ढंग से संकलित करने के लिए) कभी कभी http://www.kernel.org/doc/Documentation/kbuild/modules.txt

से समझाया गया है, एक बाहरी मॉड्यूल एक और बाहरी मॉड्यूल से प्रतीकों निर्यात उपयोग करता है। अपरिभाषित प्रतीकों के बारे में चेतावनी थूकने से बचने के लिए kbuild को सभी प्रतीकों का पूर्ण ज्ञान होना चाहिए। इस स्थिति के लिए तीन समाधान मौजूद हैं।

नोट: शीर्ष-स्तरीय केबिल्ड फ़ाइल के साथ विधि की अनुशंसा की जाती है लेकिन कुछ स्थितियों में अव्यवहारिक हो सकती है।

एक शीर्ष स्तर kbuild फ़ाइल का प्रयोग करें आप दो मॉड्यूल, foo.ko और bar.ko, जहां foo.ko bar.ko से प्रतीकों की जरूरत है, तो आप तो दोनों एक सामान्य शीर्ष-स्तरीय kbuild फ़ाइल का उपयोग कर सकते मॉड्यूल समान निर्माण में संकलित किए गए हैं। निम्न निर्देशिका लेआउट पर विचार करें:

./foo/ <= contains foo.ko  ./bar/ <= contains bar.ko 

    The top-level kbuild file would then look like: 

    #./Kbuild (or ./Makefile):   obj-y := foo/ bar/ 

    And executing 

     $ make -C $KDIR M=$PWD 

    will then do the expected and compile both modules with   full 

या तो मॉड्यूल से प्रतीकों का ज्ञान।

एक अतिरिक्त मॉड्यूल.symvers फ़ाइल का उपयोग करें जब कोई बाहरी मॉड्यूल बनाया जाता है, एक मॉड्यूल.symvers फ़ाइल उत्पन्न होती है जिसमें सभी निर्यात किए गए प्रतीकों होते हैं जिन्हें कर्नेल में परिभाषित नहीं किया जाता है। bar.ko से प्रतीकों तक पहुंच प्राप्त करने के लिए, moo.sको संकलित करने के लिए module.symvers फ़ाइल को कॉपी करें जहां foo.ko बनाया गया है। मॉड्यूल बिल्ड के दौरान, kbuild बाहरी मॉड्यूल की निर्देशिका में Module.symvers फ़ाइल को पढ़ेगा, और जब निर्माण समाप्त हो जाएगा, तो एक नया Module.symvers फ़ाइल बनाई गई है जिसमें सभी प्रतीकों का योग परिभाषित है और भाग नहीं है कर्नेल का।

उपयोग चर KBUILD_EXTRA_SYMBOLS "बनाना" यदि यह एक अन्य मॉड्यूल से प्रतिलिपि Module.symvers के लिए अव्यावहारिक है, तो आप अपने निर्माण फ़ाइल में KBUILD_EXTRA_SYMBOLS करने के लिए फ़ाइलों के एक अंतरिक्ष पृथक सूची प्रदान कर सकते हैं। की प्रारंभिक तालिका के दौरान इन फ़ाइलों को मॉडपोस्ट द्वारा लोड किया जाएगा।

+0

बढ़िया! मैंने यह खो दिया। धन्यवाद गोस्कर! – MirkoBanchi

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

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