Usbhid.ko'yu yüklemeye çalışırken “module_layout için simge sürümü yok”


27

İçin kendi modülümü kurmaya çalışıyorum usbhid.koama derledikten sonra modülü yükleyemiyorum. dmesgdiyor ki no symbol version for module_layout. Sorunun ne olduğunu merak ediyorum? Ubuntu tarafından sağlanan çekirdek kaynağını zaten kullandım ve çekirdek sürümünün de aynı olduğundan emin oldum.

Yanıtlar:


22

Spesifik olarak problem şu ki, modülünüzü kurduğunuzda, çekirdek kaynak ağacında muhtemelen Modules.symvers dosyası eksikti. Modeminizi kurduğunuzda kbuild sistemi aslında sizi uyarıyor. Modules.symvers eksikse, 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ığı ve kipliği yoktur.

Eğer çekirdeğiniz CONFIG_MODVERSIONSetkinleştirilmişse, sürücünüzü inşa etmenin mütevazi aşamasında -m seçeneğiyle scripts / mod / modpost komutunu çalıştıracaktır . Cesursanız ve scripts / mod / modpost.c kaynağına bakarsanız , -m seçeneğinin vmlinux'den _module_layout_ sembolünü eklediğini göreceksiniz, ancak çekirdeğinizden Modules.symvers yoksa, bu sembol için CRC değerini alamazsınız ve bu hata mesajıyla sonuçlanırsınız.

Yani bunun etrafında iki yol var.

1) Modules.symvers oluşturmak için çalışan çekirdeğinizin tam derlemesini ç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 modülünüzü yine de yüklemesini söylemektir:

modprobe -f <module>

Ben seçenek 2 lehine eğilimindedir :)


1
"Aptal modprobe söyle, bu saçmalığı görmezden gelip sadece modülünü yine de yüklemesini söyle" yorumu için.
Hayri Uğur Koltuk

2 denedim ve modülün açılışta otomatik yüklenmeyeceğini öğrendim. önyükleme zamanında -f için bir yolu var mı?
Justin Zhang

17

Var hem linux-headersve linux-sourceyüklü Çekirdeğiniz tekabül paketler. Örneğin, çekirdek 3.2.0-27-generic-paeiçin ihtiyacınız olan:

  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)yüklü çekirdek paketinizden gelen sürüm dizesini yukarıdan değiştirmeniz gerekir .
Yukarıdaki örnekte paket versiyonu 3.2.0-27-generic-pae. Çalıştırdığınızda uname -rve çıktısı farklı olduğunda, o 3.2.0-27-generic-paezaman $(uname -r)yüklü dizideki sürüm dizesiyle eşleşmesi için her birini aşağıda değiştirmeniz gerekir .

  1. cd /usr/src/linux-source-$Version ve .tar.bz2 arşivini yerinde açın ve çıkartılan dizine cd atın - bunu zaten yaptınız sanırım
  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=İhtiyaçlarınıza uyacak şekilde yolu değiştirin

Ne yazık ki, Module.symversdokunulmaz tutarken belirli bir modül nasıl yapılır bilmiyorum . make drivers/usb/serial/option.koÖrneğin, yapmak Module.symversdosyayı öldürür ve asıl sorununuzla sonuçlanırsınız. M=Parametreyi kullanmak onu öldürmez, ancak tüm modülleri belirtilen yolda oluşturmalısınız - ve henüz bunun çevresinde bir yol bulamadım.


Modülün aynı ağaç sürümünde derlenmesi durumunda, işleri yapmanın en iyi yolu bu ...
Treviño

2

Çalıştırmadan önce tam olarak aynı çekirdek konfigürasyonunu kullanmalısınız make prepare. Ayrıca, ağaçtan inşa ediyorsanız, o anda çalışan çekirdeğinizle (veya derleme sırasında çalıştırmıyorsanız hedef olanla) eşleşen tam olarak aynı çekirdek başlıklarına karşı oluşturmanız gerekir.


"mrproper yapmak", "cp / boot / config - $ (uname -r) .config", "make oldconfig", "make prepara", "script yaz" Bu derlemeyi hazırlamak için kullandım. Doğru yapılandırma dosyasını kopyalayıp kopyalamadığımı bilmek ister miyim? sanırım / boot / 'daki çekirdek versiyonumla eşleşen tek bir yapılandırma var. yorum kutusunun biçimi olmadığı için üzgünüm ....
SpecC

Evet, bu doğru görünüyor. Yapıyı nereden çağırıyorsunuz ve üst düzey dizinden değilse, hangi SUBDIRS değerini geçiyorsunuz?
Daniel T Chen

Yanıt için teşekkürler. usbhid.ko'yu yapmaya çalıştığımda. Bu komutu "make module SUBDIRS = drivers / hid /
usbhid

"make module SUBDIRS = drivers / hid / usbhid" komutunu çalıştırdığımda aşağıdaki uyarıyı alıyorum "UYARI: Symbol sürüm dökümü / usr/src/linux-source-2.6.31/Module.symvers eksik; bağımlılık ve küfür yok. "
SpecC

@SpecC Sorunu araştırırken, orijinal sorunuzu attığınız adımlarla güncelleyin. Sonra Dan cevabını güncelleyecek ve gömülü olan bir dizi yorum yerine siz onu çözene kadar güncellemeye devam edeceksiniz, daha fazla ipucu için kılavuza bakın: meta.askubuntu.com/questions/257/how-does-ask -ubuntu-işi
Jorge Castro
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.