"Usbhid.ko लोड करने का प्रयास करते समय मॉड्यूल_लेआउट के लिए कोई प्रतीक संस्करण नहीं"


27

मैं अपना स्वयं का मॉड्यूल बनाने की कोशिश कर रहा हूं usbhid.ko, लेकिन संकलित करने के बाद, मैं मॉड्यूल लोड नहीं कर सकता। dmesgकहता है no symbol version for module_layout। मैं सोच रहा हूँ कि समस्या क्या है? मैंने पहले ही उबंटू द्वारा प्रदान किए गए कर्नेल स्रोत का उपयोग कर लिया है और मैंने यह भी सुनिश्चित कर लिया है कि कर्नेल संस्करण समान है।

जवाबों:


22

विशेष रूप से समस्या यह है कि जब आपने अपना मॉड्यूल बनाया था, तो कर्नेल स्रोत का पेड़ शायद मॉड्यूलस.सिमर फाइल को याद कर रहा था। जब आप अपने मॉड्यूल का निर्माण करते हैं, तो kbuild सिस्टम वास्तव में आपको इस बारे में चेतावनी देता है। यदि Modules.symvers गायब है, तो आप देखेंगे:

चेतावनी: प्रतीक संस्करण डंप /usr/src/linux-2.6.34-12/Modules.symvers गायब है; मॉड्यूल की कोई निर्भरता और परिवर्तन नहीं होंगे।

यदि आपका कर्नेल CONFIG_MODVERSIONSसक्षम है, तो अपने ड्राइवर के निर्माण के चरण के दौरान यह -m विकल्प के साथ स्क्रिप्ट / मॉड / मोडपोस्ट चलाएगा । यदि आप बहादुर हैं और स्क्रिप्ट / mod / modpost.c स्रोत पर एक नज़र डालते हैं , तो आप देखेंगे कि -m विकल्प vmlinux से _module_layout_ प्रतीक जोड़ता है, हालाँकि अगर आपके पास कर्नेल से Modules.symvers नहीं हैं, आपको इस प्रतीक के लिए CRC मान नहीं मिलेगा और आप इस त्रुटि संदेश के साथ समाप्त हो जाएंगे।

तो इसके आसपास दो तरीके हैं।

1) Modules.symvers उत्पन्न करने के लिए अपने चलने वाले कर्नेल का एक पूर्ण निर्माण चलाएँ, फिर अपने मॉड्यूल का पुनर्निर्माण करें। [Http://www.mjmwired.net/kernel/Documentation/kbuild/modules.txt][1]

51  === 2. How to Build External Modules
52  
53  To build external modules, you must have a prebuilt kernel available
54  that contains the configuration and header files used in the build.
55  Also, the kernel must have been built with modules enabled. If you are
56  using a distribution kernel, there will be a package for the kernel you
57  are running provided by your distribution.
58  
59  An alternative is to use the "make" target "modules_prepare." This will
60  make sure the kernel contains the information required. The target
61  exists solely as a simple way to prepare a kernel source tree for
62  building external modules.
63  
64  NOTE: "modules_prepare" will not build Module.symvers even if
65  CONFIG_MODVERSIONS is set; therefore, a full kernel build needs to be
66  executed to make module versioning work.

2) दूसरा विकल्प यह है कि बेवकूफ मोडप्रॉब को केवल उस सभी बकवास को अनदेखा करना और अपने मॉड्यूल को केवल लोड करना है:

modprobe -f <module>

मैं विकल्प 2 का पक्ष लेता हूं :)


1
+1 के लिए "बेवकूफ modprobe को बताएं कि केवल उस सभी बकवास को अनदेखा करें और बस अपने मॉड्यूल को लोड करें" टिप्पणी।
हय्री उउर कोल्टुक

मैंने 2 की कोशिश की और पाया कि मॉड्यूल बूट समय पर ऑटो लोड नहीं करेगा। क्या बूट समय में -f का एक तरीका है?
जस्टिन जांग

17

आपके कर्नेल में स्थापित दोनों पैकेज linux-headersऔर linux-sourceपैकेज हैं। उदाहरण के लिए कर्नेल की 3.2.0-27-generic-paeआपको आवश्यकता है:

  1. linux-headers-3.2.0-27-generic-pae तथा
  2. linux-source-3.2.0-27-generic-pae

यदि पैकेज के लिए संस्करण आपके चल रहे कर्नेल संस्करण से मेल नहीं खाता है, तो आपको $(uname -r)ऊपर से अपने स्थापित कर्नेल पैकेज से संस्करण स्ट्रिंग के साथ बदलने की आवश्यकता है ।
उपरोक्त उदाहरण के लिए पैकेज संस्करण है 3.2.0-27-generic-pae। जब आप चलाते हैं uname -rऔर इसका आउटपुट कुछ अलग होता है, तो 3.2.0-27-generic-paeफिर आपको $(uname -r)इंस्टॉल किए गए पैकेजों से संस्करण स्ट्रिंग से मिलान करने के लिए नीचे प्रत्येक को बदलने की आवश्यकता होती है।

  1. cd /usr/src/linux-source-$Version और .tar.bz2 संग्रह को अनपैक करें और निकाले गए निर्देशिका में सीडी - मुझे लगता है कि आप पहले से ही ऐसा कर चुके हैं
  2. cp /boot/config-$(uname -r) .config कर्नेल स्रोत निर्देशिका में
  3. cp /usr/src/linux-headers-$(uname -r)/Module.symvers . कर्नेल स्रोत निर्देशिका में

आपके द्वारा कर्नेल स्रोत निर्देशिका में ऐसा करने के बाद, यह करें:

  1. make prepare
  2. make scripts
  3. make M=drivers/usb/serial- M=अपनी आवश्यकताओं के अनुरूप पथ बदलें

दुर्भाग्य से, मैं नहीं जानता कि कैसे Module.symversअछूता रखते हुए एक विशिष्ट मॉड्यूल का निर्माण किया जाए । make drivers/usb/serial/option.koउदाहरण के लिए, करना Module.symversफ़ाइल को मारता है , और आप अपनी मूल समस्या को समाप्त करते हैं। M=पैरामीटर का उपयोग करना इसे नहीं मारता है, लेकिन आपको निर्दिष्ट पथ में सभी मॉड्यूल का निर्माण करना होगा - और मुझे अभी तक इसके आसपास कोई रास्ता नहीं मिला है।


यह चीजों को करने का सबसे अच्छा तरीका लगता है, यदि आप एक ही पेड़ के संस्करण में मॉड्यूल को संकलित कर रहे हैं ...
Treviño

2

आपको चलने से पहले ठीक समान कर्नेल कॉन्फ़िगरेशन का उपयोग करना चाहिए make prepare। इसके अलावा, यदि आप इसे आउट-ऑफ-ट्री का निर्माण कर रहे हैं, तो आपको इसे वर्तमान में चल रहे कर्नेल (या यदि आप संकलन के समय इसे नहीं चला रहे हैं तो लक्ष्य एक) से मेल खाते हुए बिल्कुल समान कर्नेल हेडर के विरुद्ध बनाने की आवश्यकता है।


"मेप्रोपर बनाएं", "cp / boot / config - $ (uname -r) .config", "make oldconfig", "make ready", "make script" मैंने संकलन तैयार करने के लिए इन निर्देशों का उपयोग किया है। मैं जानना चाहूंगा कि क्या मैंने सही कॉन्फ़िगरेशन फ़ाइल की प्रतिलिपि बनाई है? ऐसा लगता है कि केवल एक ही विन्यास है जो / कर्नेल में मेरे कर्नेल संस्करण से मेल खाता है। टिप्पणी बॉक्स के रूप में स्वरूपण के बारे में खेद है .... कोई प्रारूप नहीं है
Specc

हां, यह सही लगता है। जहां आप बिल्ड का आह्वान कर रहे हैं, और यदि टॉपप्ले निर्देशिका से नहीं, तो आप कौन से SUBDIRS मूल्य से गुजर रहे हैं?
डैनियल टी चेन

उत्तर के लिए धन्यवाद। जब मैंने usbhid.ko बनाने की कोशिश की। मैंने इस कमांड का उपयोग किया "मॉड्यूल बनायें SUBDIRS = ड्राइवर / छुपाया / usbhid"
SpecC

जब मैंने कमांड "मॉड्यूल बनाएं SUBDIRS = driver / hid / usbhid" चलाया, तो मुझे निम्न चेतावनी मिलती है "चेतावनी: प्रतीक संस्करण डंप /usr/src/linux-source-2.6.31-Module.symvers गायब है; मॉड्यूल होगा कोई निर्भरता और संशोधन नहीं। "
21

@SpecC जैसा कि आप अपनी समस्या की जांच करते हैं, अपने मूल प्रश्न को उन चरणों के साथ अपडेट करें जो आप ले रहे हैं। फिर दान अपने उत्तर को अपडेट करेगा, और आप तब तक अपडेट करते रहेंगे जब तक कि आप इसे टिप्पणियों की एक स्ट्रिंग के बजाय समझ नहीं लेते हैं जो अंत में दफन हो जाते हैं, अधिक सुझावों के लिए गाइड देखें: meta.askubuntu.com/questions/257/how-does-ask -उबंटु-काम
जॉर्ज कास्त्रो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.