it-swarm-tr.com

usbhid.ko yüklerken "module_layout için sembol sürümü yok"

usbhid.ko İçin kendi modülümü oluşturmaya çalışıyorum, ancak derledikten sonra modülü yükleyemiyorum. dmesg, no symbol version for module_layout diyor. Sorunun ne olduğunu merak ediyorum? Ubuntu tarafından sağlanan çekirdek kaynağını zaten kullandım ve çekirdek sürümünün aynı olduğundan da emin oldum.

28
SpecC

Özellikle sorun, modülünüzü oluşturduğunuzda çekirdek kaynak ağacının muhtemelen Modules.symvers dosyasını eksik olmasıdır. Modülünüzü oluştururken kbuild sistemi sizi bu konuda uyarır. Modules.symvers eksikse, şunu göreceksiniz:

Uyarı: Sembol sürümü dökümü /usr/src/linux-2.6.34-12/Modules.symvers eksik; modüllerin bağımlılıkları ve sürümleri olmayacaktır.

Çekirdeğiniz CONFIG_MODVERSIONS etkinse, sürücünüzü oluşturmanın modpost aşamasında -m seçeneği ile scriptler/mod/modpost çalışacaktır. Cesursanız ve scriptler/mod/modpost.c kaynağına bir bakarsanız, -m seçeneğinin vmlinux'dan _module_layout_ sembolünü eklediğini görürsünüz, ancak Modules.symvers çekirdeğinizden, bu sembolün CRC değerini alamazsınız ve bu hata iletisiyle karşılaşırsınız.

Yani bunun etrafında iki yol var.

1) Modules.symvers oluşturmak için çalışan çekirdeğinizin tam bir yapısını çalıştırın, ardından modülünüzü yeniden oluşturun. [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) Diğer seçenek, aptal modprobe'a tüm bu saçmalıkları görmezden gelmesini ve sadece modülünüzü zaten yüklemesini söylemektir:

modprobe -f <module>

Seçenek 2'yi tercih etme eğilimindeyim :)

22
Dan Gora

Çekirdeğinize karşılık gelen linux-headers Ve linux-source Paketlerini yükleyin. Örneğin, çekirdek 3.2.0-27-generic-pae İçin şunlara ihtiyacınız vardır:

  1. linux-headers-3.2.0-27-generic-pae Ve
  2. linux-source-3.2.0-27-generic-pae.

Yukarıdaki paketlerin sürümünün çalışan çekirdek sürümünüzle eşleşmemesi durumunda, $(uname -r) öğesini yukarıda yüklü çekirdek paketinizden sürüm dizesiyle değiştirmeniz gerekir.
Yukarıdaki örnek için paket sürümü 3.2.0-27-generic-pae. uname -r Komutunu çalıştırdığınızda ve çıktısı 3.2.0-27-generic-pae 'Dan farklı bir şey olduğunda, yüklenen paketlerden sürüm dizesini eşleştirmek için aşağıdaki $(uname -r) değerini değiştirmeniz gerekir.

  1. cd /usr/src/linux-source-$Version Ve .tar.bz2 arşivini ve cd'yi ayıklanan dizine açın - sanırım bunu zaten yaptınız
  2. cp /boot/config-$(uname -r) .config çekirdek kaynak dizinine
  3. cp /usr/src/linux-headers-$(uname -r)/Module.symvers . çekirdek kaynak dizinine

Bunu yaptıktan sonra, çekirdek kaynak dizininde şunu yapın:

  1. make prepare
  2. make scripts
  3. make M=drivers/usb/serial - M= Sonrasındaki yolu ihtiyaçlarınıza göre değiştirin

Ne yazık ki, Module.symvers 'E dokunmadan belirli bir modülün nasıl oluşturulacağını bilmiyorum. Örneğin, make drivers/usb/serial/option.ko Yapmak Module.symvers Dosyasını öldürür ve sonunda orijinal sorununuzla karşılaşırsınız. M= Parametresini kullanmak onu öldürmez, ancak belirtilen yolda tüm modülleri oluşturmanız gerekir - ve henüz bir yol bulamadım.

17
Radu C

make prepare Çalıştırmadan önce tam olarak aynı çekirdek yapılandırmasını kullanmalısınız. Ayrıca, ağaç dışında oluşturuyorsanız, şu anda çalışan çekirdeğinizle (veya derleme zamanında çalıştırmıyorsanız hedef olanla) tam olarak özdeş çekirdek başlıklarına karşı oluşturmanız gerekir.

2
Daniel T Chen