2011-09-22 11 views
12

Necesito ayuda para entender por qué aparece un error cuando inserto un módulo. He intentado this sin éxito.Símbolo desconocido al cargar un módulo 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] 

$ 

Muchas gracias.

Respuesta

9

que han resuelto este problema como se sugiere en this forum:

  1. Compilado scst.
  2. anexas, la generada a Module.symvers existentes /lib/modules/<version>/build/Module.symvers (Hack. No sé por qué el kernel no vio los símbolos exportados).
  3. Copié el scst en /lib/modules/<version>/extra.
  4. depmod -a.
  5. compilado lpfc_scst.
  6. Módulo insertado lpfc_scst sin problemas.

Que tengas un buen día.

+0

funcionó de manera ligeramente invertida para mí: 1. copie Module.symvers en la raíz del árbol fuente del kernel. 2. compilar módulo, etc. –

1

Si está intentando insmod un módulo que fue construido contra un árbol fuente/encabezados del kernel que no son la fuente real del kernel en ejecución, la causa más probable es que alguna configuración del núcleo sea diferente entre el kernel en ejecución y el uno contra el que construiste el módulo. El enlazador dentro del kernel de Linux realmente mira varias cosas además del nombre del símbolo para símbolos coincidentes, incluyendo posiblemente un hash del parámetro de función y valor de retorno, varias opciones de configuración (preventivo/no preventivo) cuando intenta emparejar nombres de símbolo. Supongo que en su caso no encuentra la coincidencia adecuada debido a las diferentes opciones de configuración

+0

No, no es mi caso. Construí el módulo kernel contra el kernel en ejecución real, entonces intenté 'insmod'. –

2

Esto significa que el kernel no permite que los módulos vean esa variable. Todo tiene un aspecto como si no hubiera añadido sus variables a la lista de símbolos que las exportaciones del kernel:

EXPORT_SYMBOL_NOVERS(scst_register_target); 
+0

líneas 'EXPORT_SYMBOL (scst_register_target);' están presentes en los archivos fuente. –

+0

¿obsoleto el 'EXPORT_SYMBOL_NOVERS' en 2.6? –

Cuestiones relacionadas