Niedawno przeszedłem przez Rozpakowywanie kernel-source rpm off-system (OpenSuse)? ; i jak zajęło mi> 10 h na mojej maszynie, wyobraź sobie moje zdziwienie, że po wykonaniu opisanego tam procesu nie znajduję Module.symvers
nigdzie!
Kiedy szukam „wygeneruj Module.symvers”, otrzymuję to:
UWAGA: „module_prepare” nie zbuduje Module.symvers, nawet jeśli
ustawiono CONFIG_MODVERSIONS; dlatego należy wykonać pełną kompilację jądra,
aby wersjonowanie modułów działało.
( Dokumentacja jądra systemu Linux :: kbuild: modules.txt )
... ale tak naprawdę tego nie rozumiem - czy jądro nie zostało zbudowane w poprzednim kroku (opisanym w linku podanym powyżej? Na pewno wiem, że CC zajęło> 10 h, aby wygenerować całą masę * .o pliki i LD, aby je połączyć, więc coś musiało zostać zbudowane. Ale jeśli tak, to gdzie to jest Module.symvers
?
Mówiąc dokładniej, jakie dokładnie polecenie powinienem wywołać, aby wygenerować Module.symvers? Wiem, że make prepare
to nie zadziała - ale jakie będzie to polecenie?
źródło
Module.symvers
przezzypper install kernel-source
, i podobnie na innych distro linux. Plik znajduje się wlib/modules/xxx/build
.Odpowiedzi:
Module.symvers
Jest (re) generowany kiedy (re) moduły skompilować. Uruchommake modules
, a powinieneś otrzymaćModule.symvers
plik w katalogu głównym drzewa jądra.Zauważ, że jeśli tylko prowadził
make
i niemake modules
, nie zbudowali jeszcze żadnych modułów. Symbole z samego jądra (vmlinux
lub jednego z formatów obrazów zależnych od architektury) znajdują się wSystem.map
.źródło
make modules
to naprawdę tworzyModule.symvers
. Dziękuję również za wyjaśnienie różnicy międzymake
imake modules
oraz stosunku doSystem.map
. Twoje zdrowie!insmod
.dla osób, które znalazły to pytanie, przeglądając ostrzeżenie, które pojawia się podczas kompilacji jednego z przykładowych LKM Dereka Molloya: możesz po prostu zrobić puste
touch Modules.symvers
. jeśli twoje jądro nie używa modyfikacji (CRC używane przez system operacyjny, aby upewnić się, że moduły pasują do jądra) i twój moduł nie ma żadnych zależności od innych modułów, będzie to wystarczające, aby ukryć ostrzeżenie.pusty plik jest tak samo dobry jak ten wygenerowany przez gcc, który ma tylko wszystkie symbole o tej samej
0x00000000
wartości CRC, w systemie bez konwersji.źródło
W CentOS i być może w innych wariantach RedHat, po prostu wypakuj odpowiedni plik dla działającego jądra:
W Ubuntu i być może w innych wariantach Debiana plik wydaje się automatycznie. Jednak jeśli go potrzebujesz, plik jest tutaj:
źródło
linux-headers-$(uname -r)
folderu