2011-09-22 12 views
12

Potrzebuję pomocy w zrozumieniu, dlaczego pojawia się błąd podczas wstawiania modułu. Próbowałem this bez powodzenia.Nieznany symbol podczas ładowania modułu jądra

$ sudo modprobe lpfc_scst 
FATAL: Error inserting lpfc_scst (/lib/modules/2.6.32-33-generic/extra/lpfc_scst.ko): Unknown symbol in module, or unknown parameter (see dmesg) 

$ dmesg | tail 
[ 1201.262842] lpfc_scst: Unknown symbol scst_register_target 
[ 1201.262949] lpfc_scst: Unknown symbol lpfc_tm_term 
[ 1201.263161] lpfc_scst: no symbol version for scst_register_session 
[ 1201.263164] lpfc_scst: Unknown symbol scst_register_session 
[ 1201.263284] lpfc_scst: no symbol version for scst_rx_mgmt_fn 
[ 1201.263286] lpfc_scst: Unknown symbol scst_rx_mgmt_fn 
[ 1201.263395] lpfc_scst: no symbol version for scst_unregister_session 
[ 1201.263398] lpfc_scst: Unknown symbol scst_unregister_session 
[ 1201.263573] lpfc_scst: no symbol version for scst_rx_data 
[ 1201.263575] lpfc_scst: Unknown symbol scst_rx_data 

$ cat /proc/kallsyms | grep scst_register_target 
dffd2a10 r __ksymtab_scst_register_target [scst] 
dffd302e r __kstrtab_scst_register_target [scst] 
dffd2b34 r __kcrctab_scst_register_target [scst] 
dffd2a20 r __ksymtab___scst_register_target_template_non_gpl [scst] 
dffd3063 r __kstrtab___scst_register_target_template_non_gpl [scst] 
dffd2b3c r __kcrctab___scst_register_target_template_non_gpl [scst] 
dffd2c10 r __ksymtab___scst_register_target_template [scst] 
dffd308b r __kstrtab___scst_register_target_template [scst] 
dffd2de8 r __kcrctab___scst_register_target_template [scst] 
dff913a0 t __scst_register_target_template [scst] 
dff90dd0 T scst_register_target [scst] 
dff91840 T __scst_register_target_template_non_gpl [scst] 

$ 

Wielkie dzięki.

Odpowiedz

9

Mam rozwiązać ten problem jak sugerowano na this forum:

  1. skompilowany scst.
  2. Dołączony wygenerowany Module.symvers do istniejącego /lib/modules/<version>/build/Module.symvers (Hack .Nie wiem, dlaczego jądro nie widziało wyeksportowanych symboli).
  3. Skopiowano numer scst do /lib/modules/<version>/extra.
  4. depmod -a.
  5. Skompilowana lpfc_scst.
  6. Wstawiony moduł lpfc_scst bez żadnych problemów.

Miłego dnia.

+0

Dla mnie działa to w nieco odwrotny sposób: 1. Skopiuj Module.symvers do katalogu głównego drzewa źródłowego jądra. 2. moduł kompilacji, itp ... –

1

Jeśli próbujesz insmodować moduł, który został zbudowany na drzewie źródłowym/nagłówkach jądra, które nie są rzeczywistym źródłem uruchomionego jądra, najbardziej prawdopodobną przyczyną jest to, że niektóre konfiguracje jądra różnią się między działającym jądrem a z którego zbudowałeś moduł.

Łącznik wewnątrz jądra Linuksa faktycznie szuka wielu rzeczy oprócz nazwy symbolu dla pasujących symboli, w tym prawdopodobnie skrótu parametru funkcji i wartości zwracanej, różnych opcji konfiguracji (preempt/non preempt) przy próbie dopasowania nazwy symboli. Przypuszczam, że w twoim przypadku nie znaleziono właściwego dopasowania z powodu różnych opcji konfiguracji:

+0

Nie, to nie jest moja sprawa. Zbudowałem moduł jądra na działającym jądrze, więc tam, gdzie próbowałem "insmodować". –

2

Oznacza to, że jądro nie pozwala modułom na zobaczenie tej zmiennej. To nie wygląda na to, że nie zostały dodane zmienne do listy symboli, że wywóz jądra:

EXPORT_SYMBOL_NOVERS(scst_register_target); 
+0

linie 'EXPORT_SYMBOL (scst_register_target);' są prezentowane w plikach źródłowych. –

+0

czy "EXPORT_SYMBOL_NOVERS" jest przestarzałe w wersji 2.6? –

Powiązane problemy