Problem polega na tym, że podczas budowania modułu w drzewie źródeł jądra prawdopodobnie brakowało pliku Modules.symvers. System Kbuild faktycznie ostrzega o tym podczas budowania modułu. Jeśli brakuje Modules.symvers, zobaczysz:
Ostrzeżenie: brak wersji zrzutu /usr/src/linux-2.6.34-12/Modules.symvers; moduły nie będą miały żadnych zależności ani wersji.
Jeśli twoje jądro zostało CONFIG_MODVERSIONS
włączone, to podczas fazy modpost budowania sterownika uruchomi skrypty / mod / modpost z opcją -m. Jeśli jesteś odważny i rzucisz okiem na źródło scripts / mod / modpost.c , zobaczysz, że opcja -m dodaje symbol _module_layout_ z vmlinux, jednak jeśli nie masz Modules.symvers z twojego jądra, nie otrzymasz wartości CRC dla tego symbolu i pojawi się ten komunikat o błędzie.
Istnieją więc dwa sposoby na obejście tego.
1) uruchom pełną wersję działającego jądra, aby wygenerować Modules.symvers, a następnie przebuduj moduł. [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) Inną opcją jest powiedzenie głupiemu modprobe, aby po prostu zignorował te badziewie i po prostu załadował moduł:
modprobe -f <module>
Preferuję opcję 2 :)
Zainstaluj oba pakiety
linux-headers
ilinux-source
odpowiadające twojemu jądru. Na przykład dla jądra3.2.0-27-generic-pae
potrzebujesz:linux-headers-3.2.0-27-generic-pae
ilinux-source-3.2.0-27-generic-pae
.W przypadku, gdy wersja powyższych pakietów nie odpowiada bieżącej wersji jądra, musisz zastąpić
$(uname -r)
ciągiem wersji z zainstalowanego pakietu jądra z góry.W powyższym przykładzie wersja pakietu to
3.2.0-27-generic-pae
. Gdy uruchomisz,uname -r
a jego wynik jest inny3.2.0-27-generic-pae
, musisz zastąpić każdy z nich$(uname -r)
poniżej, aby dopasować ciąg wersji z zainstalowanych pakietów.cd /usr/src/linux-source-$Version
i rozpakuj archiwum .tar.bz2 na miejscu i włóż cd do wyodrębnionego katalogu - myślę, że już to zrobiłeścp /boot/config-$(uname -r) .config
do katalogu źródłowego jądracp /usr/src/linux-headers-$(uname -r)/Module.symvers .
do katalogu źródłowego jądraPo wykonaniu tej czynności w katalogu źródłowym jądra wykonaj następujące czynności:
make prepare
make scripts
make M=drivers/usb/serial
- zmień ścieżkę poM=
według własnych potrzebNiestety nie wiem, jak zbudować konkretny moduł, pozostając
Module.symvers
nietkniętym. Robimake drivers/usb/serial/option.ko
, na przykład, zabijaModule.symvers
plik i skończyć z oryginalnego problemu. UżycieM=
parametru nie zabija go, ale musisz zbudować wszystkie moduły w określonej ścieżce - a ja jeszcze nie znalazłem sposobu na obejście tego.źródło
Musisz użyć dokładnie identycznej konfiguracji jądra przed uruchomieniem
make prepare
. Ponadto, jeśli budujesz go z drzewa, musisz budować go w oparciu o dokładnie identyczne nagłówki jądra pasujące do aktualnie uruchomionego jądra (lub docelowego, jeśli nie uruchamiasz go w czasie kompilacji).źródło