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_MODVERSIONS
diaktifkan, 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 :)
Apakah kedua paket
linux-headers
dan yanglinux-source
sesuai dengan kernel Anda diinstal. Misalnya untuk kernel yang3.2.0-27-generic-pae
Anda butuhkan:linux-headers-3.2.0-27-generic-pae
danlinux-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 menjalankanuname -r
dan hasilnya adalah sesuatu yang berbeda maka3.2.0-27-generic-pae
Anda perlu mengganti masing-masing di$(uname -r)
bawah ini untuk mencocokkan string versi dari paket yang diinstal.cd /usr/src/linux-source-$Version
dan membongkar arsip .tar.bz2 di tempat dan cd ke direktori diekstraksi - saya kira Anda sudah melakukan inicp /boot/config-$(uname -r) .config
ke dalam direktori sumber kernelcp /usr/src/linux-headers-$(uname -r)/Module.symvers .
ke dalam direktori sumber kernelSetelah Anda selesai melakukannya, di direktori source kernel, lakukan ini:
make prepare
make scripts
make M=drivers/usb/serial
- ubah jalur setelahnyaM=
sesuai dengan kebutuhan AndaSayangnya, saya tidak tahu bagaimana membangun modul tertentu sambil tetap
Module.symvers
tidak tersentuh. Melakukanmake drivers/usb/serial/option.ko
, misalnya, membunuhModule.symvers
file, dan Anda berakhir dengan masalah asli Anda. MenggunakanM=
parameter tidak membunuhnya, tetapi Anda harus membangun semua modul di jalur yang ditentukan - dan saya belum menemukan cara mengatasinya.sumber
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).sumber