“Tidak ada versi simbol untuk module_layout” ketika mencoba memuat usbhid.ko

27

Saya mencoba membuat modul sendiri usbhid.ko, tetapi setelah dikompilasi, saya tidak dapat memuat modul. dmesgkata no symbol version for module_layout. Saya bertanya-tanya apa masalahnya? Saya sudah menggunakan sumber kernel yang disediakan oleh Ubuntu dan saya juga memastikan versi kernelnya sama.

SpecC
sumber

Jawaban:

22

Khususnya apa masalahnya adalah ketika Anda membangun modul Anda, pohon sumber kernel mungkin hilang file Modules.symvers. Sistem kbuild sebenarnya memperingatkan Anda tentang hal ini ketika Anda membangun modul Anda. Jika Modules.symvers hilang, Anda akan melihat:

Peringatan: Simbol versi dump /usr/src/linux-2.6.34-12/Modules.symvers tidak ada; modul tidak akan memiliki dependensi dan modifikasi.

Jika kernel Anda telah CONFIG_MODVERSIONSdiaktifkan, maka selama fase modpost membangun driver Anda, itu akan menjalankan skrip / mod / modpost dengan opsi -m. Jika Anda berani dan melihat sumber skrip / mod / modpost.c , Anda akan melihat bahwa opsi -m menambahkan simbol _module_layout_ dari vmlinux, namun jika Anda tidak memiliki Modul.symvers dari kernel Anda, Anda tidak akan mendapatkan nilai CRC untuk simbol ini dan Anda akan berakhir dengan pesan kesalahan ini.

Jadi ada dua cara untuk mengatasi ini.

1) jalankan build penuh dari kernel Anda yang sedang berjalan untuk menghasilkan Modul. [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) Pilihan lainnya adalah memberi tahu modprobe bodoh untuk mengabaikan semua omong kosong itu dan hanya memuat modul Anda:

modprobe -f <module>

Saya cenderung menyukai opsi 2 :)

Dan Gora
sumber
1
+1 untuk "beri tahu modprobe bodoh untuk mengabaikan semua omong kosong itu dan hanya memuat modul Anda saja" komentar.
Hayri Uğur Koltuk
Saya mencoba 2 dan menemukan bahwa modul tidak akan memuat secara otomatis saat boot. apakah ada cara untuk -f saat boot?
Justin Zhang
17

Apakah kedua paket linux-headersdan yang linux-sourcesesuai dengan kernel Anda diinstal. Misalnya untuk kernel yang 3.2.0-27-generic-paeAnda butuhkan:

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

Jika versi untuk paket-paket di atas tidak cocok dengan versi kernel Anda yang sedang berjalan maka Anda perlu mengganti $(uname -r)dengan string versi dari paket kernel yang Anda instal dari atas.
Untuk contoh di atas versi paketnya adalah 3.2.0-27-generic-pae. Ketika Anda menjalankan uname -rdan hasilnya adalah sesuatu yang berbeda maka 3.2.0-27-generic-paeAnda perlu mengganti masing-masing di $(uname -r)bawah ini untuk mencocokkan string versi dari paket yang diinstal.

  1. cd /usr/src/linux-source-$Version dan membongkar arsip .tar.bz2 di tempat dan cd ke direktori diekstraksi - saya kira Anda sudah melakukan ini
  2. cp /boot/config-$(uname -r) .config ke dalam direktori sumber kernel
  3. cp /usr/src/linux-headers-$(uname -r)/Module.symvers . ke dalam direktori sumber kernel

Setelah Anda selesai melakukannya, di direktori source kernel, lakukan ini:

  1. make prepare
  2. make scripts
  3. make M=drivers/usb/serial- ubah jalur setelahnya M=sesuai dengan kebutuhan Anda

Sayangnya, saya tidak tahu bagaimana membangun modul tertentu sambil tetap Module.symverstidak tersentuh. Melakukan make drivers/usb/serial/option.ko, misalnya, membunuh Module.symversfile, dan Anda berakhir dengan masalah asli Anda. Menggunakan M=parameter tidak membunuhnya, tetapi Anda harus membangun semua modul di jalur yang ditentukan - dan saya belum menemukan cara mengatasinya.

Radu C
sumber
Ini sepertinya cara terbaik untuk melakukan sesuatu, jika Anda menyusun modul dalam versi pohon yang sama ...
Treviño
2

Anda harus menggunakan konfigurasi kernel yang persis sama sebelum menjalankan make prepare. Juga, jika Anda membangunnya di luar pohon, Anda harus membangunnya terhadap header kernel yang persis sama dengan yang cocok dengan kernel Anda saat ini (atau target jika Anda tidak menjalankannya pada saat kompilasi).

Daniel T Chen
sumber
"make mrproper", "cp / boot / config - $ (uname -r) .config", "make oldconfig", "make prep", "make scripts" Saya telah menggunakan instruksi ini untuk menyiapkan kompilasi. Saya ingin tahu apakah saya sudah menyalin file konfigurasi yang benar? sepertinya hanya ada satu konfigurasi yang cocok dengan versi kernel saya di / boot /. maaf tentang format karena kotak komentar tidak memiliki format ....
SpecC
Ya, itu sepertinya benar. Di mana Anda memohon build, dan jika bukan dari direktori tingkat atas, berapa nilai SUBDIRS yang Anda lewati?
Daniel T Chen
Terima kasih balasannya. ketika saya mencoba membangun usbhid.ko. Saya menggunakan perintah ini "make modules SUBDIRS = drivers / hid / usbhid"
SpecC
ketika saya menjalankan perintah "make modules SUBDIRS = drivers / hid / usbhid", saya mendapatkan peringatan berikut "PERINGATAN: Versi simbol dump /usr/src/linux-source-2.6.31/Module.symvers tidak ada; modul akan memiliki tidak ada dependensi dan modifikasi. "
SpecC
@SpecC Saat Anda menyelidiki masalah Anda, perbarui pertanyaan awal Anda dengan langkah-langkah yang Anda ambil. Lalu Dan akan memperbarui jawabannya, dan Anda akan terus memperbarui hingga Anda mengetahuinya, bukannya serangkaian komentar yang akhirnya terkubur, lihat panduan untuk kiat lainnya: meta.askubuntu.com/questions/257/how-does-ask -ubuntu-work
Jorge Castro