"Sin versión de símbolo para module_layout" al intentar cargar usbhid.ko

27

Estoy tratando de construir mi propio módulo usbhid.ko, pero después de compilar, no puedo cargar el módulo. dmesgdice no symbol version for module_layout. Me pregunto cuál es el problema. Ya he usado la fuente del núcleo proporcionada por Ubuntu y también me he asegurado de que la versión del núcleo sea la misma.

SpecC
fuente

Respuestas:

22

Específicamente, el problema es que cuando compiló su módulo, el árbol de origen del núcleo probablemente no tenía el archivo Modules.symvers. El sistema kbuild realmente le advierte sobre esto cuando construye su módulo. Si falta Módulos.symvers, verá:

Advertencia: Falta el volcado de la versión del símbolo /usr/src/linux-2.6.34-12/Modules.symvers; Los módulos no tendrán dependencias ni modificaciones.

Si su núcleo se ha CONFIG_MODVERSIONShabilitado, durante la fase de modificación de compilación de su controlador ejecutará scripts / mod / modpost con la opción -m. Si eres valiente y echas un vistazo a la fuente scripts / mod / modpost.c , verás que la opción -m agrega el símbolo _module_layout_ de vmlinux, sin embargo, si no tienes Modules.symvers desde tu kernel, no obtendrá el valor CRC para este símbolo y terminará con este mensaje de error.

Así que hay dos formas de evitar esto.

1) ejecute una compilación completa de su núcleo en ejecución para generar Modules.symvers, luego reconstruya su módulo. [http://www.mjmwired.net/kernel/Documentation/kbuild/modules.txtfont>[1]

51  === 2. How to Build External Modules
52  
53  To build external modules, you must have a prebuilt kernel available
54  that contains the configuration and header files used in the build.
55  Also, the kernel must have been built with modules enabled. If you are
56  using a distribution kernel, there will be a package for the kernel you
57  are running provided by your distribution.
58  
59  An alternative is to use the "make" target "modules_prepare." This will
60  make sure the kernel contains the information required. The target
61  exists solely as a simple way to prepare a kernel source tree for
62  building external modules.
63  
64  NOTE: "modules_prepare" will not build Module.symvers even if
65  CONFIG_MODVERSIONS is set; therefore, a full kernel build needs to be
66  executed to make module versioning work.

2) La otra opción es decirle a la estúpida sonda mod que simplemente ignore toda esa basura y simplemente cargue su módulo de todos modos:

modprobe -f <module>

Tiendo a favor de la opción 2 :)

Dan Gora
fuente
1
+1 para "dile a la estúpida sonda mod que ignore toda esa basura y simplemente cargue su módulo de todos modos".
Hayri Uğur Koltuk
Intenté 2 y descubrí que el módulo no se cargará automáticamente en el momento del arranque. ¿hay alguna manera de -f en el momento del arranque?
Justin Zhang
17

Tenga instalados los paquetes linux-headersy linux-sourcecorrespondientes a su núcleo. Por ejemplo para kernel 3.2.0-27-generic-paenecesitas:

  1. linux-headers-3.2.0-27-generic-pae y
  2. linux-source-3.2.0-27-generic-pae.

En caso de que la versión de los paquetes anteriores no coincida con la versión del kernel en ejecución, debe reemplazarla $(uname -r)con la cadena de versión del paquete del kernel instalado desde arriba.
Para el ejemplo anterior, la versión del paquete es 3.2.0-27-generic-pae. Cuando ejecuta uname -ry su salida es algo diferente, 3.2.0-27-generic-paeentonces debe reemplazar cada uno de los $(uname -r)siguientes para que coincida con la cadena de versión de los paquetes instalados.

  1. cd /usr/src/linux-source-$Version y desempaquete el archivo .tar.bz2 en su lugar y cd en el directorio extraído - Supongo que ya lo hizo
  2. cp /boot/config-$(uname -r) .config en el directorio fuente del kernel
  3. cp /usr/src/linux-headers-$(uname -r)/Module.symvers . en el directorio fuente del kernel

Después de hacer eso, en el directorio de origen del núcleo, haga esto:

  1. make prepare
  2. make scripts
  3. make M=drivers/usb/serial- cambia el camino luego M=para satisfacer tus necesidades

Desafortunadamente, no sé cómo construir un módulo específico mientras me mantengo Module.symversintacto. Hacerlo make drivers/usb/serial/option.ko, por ejemplo, mata el Module.symversarchivo y terminas con tu problema original. El uso del M=parámetro no lo mata, pero debe construir todos los módulos en la ruta especificada, y todavía no he encontrado una forma de evitarlo.

Radu C
fuente
Esta parece ser la mejor manera de hacer las cosas, en caso de que esté compilando el módulo en la misma versión de árbol ...
Treviño
2

Debe usar la configuración de kernel exactamente idéntica antes de ejecutar make prepare. Además, si lo está construyendo fuera del árbol, debe hacerlo contra los encabezados de kernel exactamente idénticos que coinciden con su kernel actualmente en ejecución (o el objetivo si no lo está ejecutando en el momento de la compilación).

Daniel T Chen
fuente
"make mrproper", "cp / boot / config - $ (uname -r) .config", "make oldconfig", "make prepare", "make scripts" He utilizado estas instrucciones para preparar la compilación. ¿Me gustaría saber si he copiado el archivo de configuración correcto? Parece que solo hay una configuración que coincide con la versión de mi kernel en / boot /. perdón por el formato ya que el cuadro de comentarios no tiene formato ...
SpecC
Sí, eso parece correcto. ¿Dónde está invocando la compilación, y si no es desde el directorio de nivel superior, qué valor SUBDIRS está pasando?
Daniel T Chen
gracias por la respuesta. cuando intenté construir el usbhid.ko. Usé este comando "make modules SUBDIRS = drivers / hid / usbhid"
SpecC
cuando ejecuté el comando "make modules SUBDIRS = drivers / hid / usbhid", recibí la siguiente advertencia "ADVERTENCIA: Descarga de la versión del símbolo /usr/src/linux-source-2.6.31/Module.symvers falta; los módulos tendrán sin dependencias ni modificaciones. "
SpecC
@SpecC Mientras investiga su problema, actualice su pregunta original con los pasos que está tomando. Entonces Dan actualizará su respuesta, y continuará actualizando hasta que lo resuelva en lugar de una cadena de comentarios que terminen enterrados, consulte la guía para obtener más consejos: meta.askubuntu.com/questions/257/how-does-ask -ubuntu-work
Jorge Castro