2009-03-09 11 views
19

लिनक्स कर्नेल मॉड्यूल है कि एक दूसरे पर निर्भर संकलन है, लिंकर की तरहलिनक्स कर्नेल मॉड्यूल लिंकर चेतावनियां: "*** चेतावनी: <function> [<module>] अपरिभाषित!" - उनसे छुटकारा पाने के लिए कोई रास्ता?

Building modules, stage 2. 
MODPOST 
*** Warning: "function_name1" [module_name] undefined! 
*** Warning: "function_name2" [module_name] undefined! 
*** Warning: "function_name3" [module_name] undefined! 

अपरिभाषित प्रतीक चेतावनी देता है के रूप में मॉड्यूल insmod या modprobe का उपयोग कर गिरी में डाला जाता है अनसुलझे प्रतीक के रूप में जल्द ही हल कर रहे हैं। क्या लिंकर चेतावनी से छुटकारा पाने का कोई तरीका है, यद्यपि?

मैंने इस मुद्दे पर 3 Google SERP के माध्यम से पढ़ा है - ऐसा लगता है कि कोई भी जवाब नहीं जानता है। जब आप कर्नेल मॉड्यूल बनाते हैं तो क्या ये लिंकर चेतावनियां इस तरह से होती हैं?

उत्तर

3

नहीं वे नहीं हैं। व्हील आप अपने कोड को पेड़ या पेड़ से बाहर बनाते हैं, यह संदेश प्रदर्शित नहीं होना चाहिए। मुझे लगता है कि आपको अपने मेकफ़ाइल को ठीक करना चाहिए। मेकफ़ाइल उदाहरण यहां दिया गया है। सही नहीं है, लेकिन काम करने के लिए प्रयोग किया जाता है (2.6.26 तक है, क्योंकि यह कोशिश नहीं की):

ifneq ($(KERNELRELEASE),) 
# We were called by kbuild 

obj-m += mymodule.o 
mymodule-objs := mymodule_usb.o a.o b.o c.o 

else # We were called from command line 

KDIR := /lib/modules/$(shell uname -r)/build 
PWD := $(shell pwd) 

default: 
    @echo ' Building FOO drivers for 2.6 kernel.' 
    @echo ' PLEASE IGNORE THE "Overriding SUBDIRS" WARNING' 
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules 

install: 
    ./do_install.sh *.ko 

endif # End kbuild check 

clean: 
    rm -f -r *.o *.ko .*cmd .tmp* core *.i 

आगे प्रलेखन के लिए, आप गिरी पेड़ की जांच कर सकते, kbuild प्रक्रिया documented

+0

उत्तर के लिए धन्यवाद। कोई विचार वास्तव में कैसे? – Gary

+0

मुझे खेद है, लेकिन यह वास्तव में काम नहीं करता है। चेतावनियां अभी भी वहां हैं। इसके अलावा, @echo कृपया "ओवरराइडिंग सबडिड्स" चेतावनी 'मुझे परेशान करता है IGNORE। मैं गूंजने के लिए एक ही दृष्टिकोण का उपयोग कर सकता हूं 'कृपया [मॉड्यूल_नाम] अपरिभाषित IGNORE! चेतावनी, लेकिन जाहिर है यह वही तरीका नहीं है जिसकी मैं तलाश कर रहा हूं। – Gary

9

अंत में है, मैं समझ गया। मुझे सही रास्ते पर रखने के लिए shodanex के लिए धन्यवाद।

अद्यतन: बहुत करते समय सावधान रहें, यह सुधार गिरी के पुराने संस्करणों के लिए बनाता है के लिए आवेदन के रूप में वहाँ गिरी जो बनाता है अपने निर्माण दुर्व्यवहार और निर्माण के पुराने संस्करणों में में Makefile.modpost फ़ाइल एक बग है जब आप KBUILD_EXTMOD विकल्प निर्दिष्ट करते हैं तो गलत लक्ष्य।

आपको KBUILD_EXTMOD पैरामीटर बनाने वाले मॉड्यूल के स्रोत के पथ को निर्दिष्ट करना होगा।

कहो, आप एक मॉड्यूल foo कि मॉड्यूल बार से प्रतीकों पर निर्भर करता है है।

foo के लिए स्रोत फ़ाइलें foo/मॉड्यूल/ और स्रोत बार के लिए फ़ाइलों में हैं बार/मॉड्यूल/

foo के लिए Makefile में मेकअप आदेश शायद

तरह लग रहा है में हैं
make ARCH=$$ARCH CROSS_COMPILE=$$CROSS_COMPILE -C $$LINUX_DIR \ 
    M=`pwd`/module \ 
    modules 

(आपकी परियोजना में सटीक रेखा भिन्न हो सकती है)।

make ARCH=$$ARCH CROSS_COMPILE=$$CROSS_COMPILE -C $$LINUX_DIR \ 
    M=`pwd`/module \ 
    KBUILD_EXTMOD=`pwd`/../bar/module \ 
    modules 

को बदलें यह (हम KBUILD_EXTMOD = pwd /../bar/module \ लाइन, जहां pwd /../bar/module कर्नेल मॉड्यूल के सूत्रों का कहना है हम निर्भर करने के लिए एक रास्ता है जोड़ा पर।

एक इस तरह से काम करने के लिए KBUILD_EXTRA_SYMBOLS उम्मीद करेंगे पैरामीटर, लेकिन यह KBUILD_EXTMOD है।

+1

लिनक्स के किस संस्करण से यह काम शुरू हो जाता है? मैंने 2.6.12 कर्नेल बिल्डिंग बाहरी मॉड्यूल पर इस विधि का उपयोग करने की कोशिश की, लेकिन इसका कोई फायदा नहीं हुआ, यह केवल बार मॉड्यूल बनाने के लिए बनाता है, पूरी तरह से foo मॉड्यूल को अनदेखा करता है, कोई मदद? – andycjw

+0

KBUILD_EXTMOD एम (और SUBDIRS) के समानार्थी है, यही कारण है कि यह बार मॉड्यूल बनाता है। Sinojs उत्तर के अनुसार KBUILD_EXTRA_SYMBOLS का उपयोग करें। –

0

मेरी पेड़ के अनुरूप होने की मेरी आवश्यकता है। हमारे स्रोत में हम एक SYMBOLSDIR कि सभी मॉड्यूल

SYMBOLSDIR = 'कुछ पथ'

मेकअप (उदाहरण के ऊपर के रूप में ही) $ (KERNELDIR) MODVERDIR = $ (SYMBOLSDIR) मॉड्यूल

करने के लिए एक रास्ता है बनाया
16

उपयोग KBUILD_EXTRA_SYMBOLS नीचे के रूप में: KBUILD_EXTRA_SYMBOLS = 'अपने मॉड्यूल पथ'/Module.symvers

+1

यह सही तरीका है। लिनक्स कर्नेल स्रोत पेड़ में दस्तावेज़ीकरण/kbuild/modules.txt इस जानकारी के लिए जाने का स्रोत है। –

+0

+1। एक संबंधित कदम में, पूरी तरह से सुनिश्चित करें कि अगर आपने कर्नेल को पुनर्निर्मित किया है (यहां तक ​​कि कोई बदलाव नहीं है), सिमर्स को सिंक में रखने के लिए बाद में एक मॉड्यूल करें। अन्यथा आपको यह त्रुटि मिलती है। – carveone

1

KBUILD_EXTMOD का उपयोग कर के ऊपर तकनीक, और सवाल जो कर्नेल संस्करणों में से यह तहत काम करता है से संबंधित:

(मेरे मॉड्यूल निर्माण तोड़ दिया)
  • andycjw यह 2.6.12
  • में उसके लिए काम नहीं किया यह 2.6.15 में मेरे लिए काम नहीं किया संकेत दिया
  • गिरी के माध्यम से देख रहे हैं करता है, मैं एक संख्या देख Makefile.modpost में परिवर्तन जो 2.6.26 और 2.6.28 में संबंधित प्रतीत होता है, इसलिए मुझे उम्मीद है कि उनमें से एक सीमा है।
संबंधित मुद्दे