2011-09-22 4 views
12

Ho bisogno di aiuto per capire perché ottengo un errore quando inserisco un modulo. Ho provato this senza successo.Simbolo sconosciuto durante il caricamento di un modulo del kernel

$ 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] 

$ 

Molte grazie.

risposta

9

ho risolto questo problema come suggerito sul this forum:

  1. Compilato scst.
  2. È stato aggiunto il numero esistente (Hack. Module.symvers esistente. Non so perché il kernel non abbia visto i simboli esportati).
  3. Copiato il scst a /lib/modules/<version>/extra.
  4. depmod -a.
  5. Compilato lpfc_scst.
  6. Modulo inserito lpfc_scst senza problemi.

Buona giornata.

+0

ha funzionato in modo leggermente inverso per me: 1. copia Module.symvers nella radice dell'albero dei sorgenti del kernel. 2. modulo di compilazione, ecc ... –

1

Se si sta provando a insmod un modulo che è stato compilato su una struttura/header di sorgenti del kernel che non sono la sorgente effettiva del kernel in esecuzione, la causa più probabile è che alcune configurazioni del kernel sono diverse tra il kernel in esecuzione e il uno su cui hai costruito il modulo.

Il linker all'interno del kernel di Linux esamina in realtà un mucchio di cose oltre al nome del simbolo per i simboli corrispondenti, incluso eventualmente un hash del parametro function e valore di ritorno, varie opzioni di configurazione (preempt/non preempt) quando si cerca di far corrispondere nomi di simboli. Immagino che nel tuo caso non trovi la corrispondenza giusta a causa delle diverse opzioni di configurazione

+0

No, non è il mio caso. Ho costruito il modulo del kernel contro il kernel in esecuzione, quindi dove ho provato a 'insmod'. –

2

Ciò significa che il kernel non consente ai moduli di vedere quella variabile. Sembra proprio che non hai aggiunto le variabili alla lista dei simboli che le esportazioni del kernel:

EXPORT_SYMBOL_NOVERS(scst_register_target); 
+0

righe 'EXPORT_SYMBOL (scst_register_target);' sono presenti nei file sorgente. –

+0

obsoleto 'EXPORT_SYMBOL_NOVERS' in 2.6? –