Jak wygenerować Module.symvers?


14

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.symversnigdzie!

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 prepareto nie zadziała - ale jakie będzie to polecenie?


FYI, w openSUSE, można uzyskać Module.symversprzez zypper install kernel-source, i podobnie na innych distro linux. Plik znajduje się w lib/modules/xxx/build.
Syrtis Major

Odpowiedzi:


16

Module.symversJest (re) generowany kiedy (re) moduły skompilować. Uruchom make modules, a powinieneś otrzymać Module.symversplik w katalogu głównym drzewa jądra.

Zauważ, że jeśli tylko prowadził makei nie make modules, nie zbudowali jeszcze żadnych modułów. Symbole z samego jądra ( vmlinuxlub jednego z formatów obrazów zależnych od architektury) znajdują się w System.map.


Wielkie dzięki za to, @Gilles - od tego czasu znalazłem również plik Answer: Module.symvers ; i może potwierdzić, że make modulesto naprawdę tworzy Module.symvers. Dziękuję również za wyjaśnienie różnicy między makei make modulesoraz stosunku do System.map. Twoje zdrowie!
sdaau

Co się stanie, jeśli „make” jest niedostępne na komputerze?
bzupnick

3
@bzupnick Zainstaluj. Jest to jedno z niezbędnych narzędzi do budowy modułów jądra Linux. Wiele programów wymaga make make.
Gilles 'SO - przestań być zły'

Próbuję skompilować LKM z innej maszyny. Instalowanie rzeczy na pierwszym polu nie jest możliwe.
bzupnick,

@bzupnick Musisz zbudować moduł i tak. Wszystko dzieje się na maszynie kompilacji, poza maszyną docelową nie ma nic do roboty insmod.
Gilles 'SO - przestań być zły'

4

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.

WARNING: Symbol version dump ./Module.symvers
         is missing; modules will have no dependencies and modversions.

pusty plik jest tak samo dobry jak ten wygenerowany przez gcc, który ma tylko wszystkie symbole o tej samej 0x00000000wartości CRC, w systemie bez konwersji.


1

W CentOS i być może w innych wariantach RedHat, po prostu wypakuj odpowiedni plik dla działającego jądra:

zcat /boot/symvers-$(uname -r).gz > ./Module.symvers

W Ubuntu i być może w innych wariantach Debiana plik wydaje się automatycznie. Jednak jeśli go potrzebujesz, plik jest tutaj:

/usr/src/linux-headers-$(uname -r)/Module.symvers

Nie mogę znaleźć linux-headers-$(uname -r)folderu
King Stone
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.