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_MODVERSIONS
habilitado, 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 :)
Tenga instalados los paquetes
linux-headers
ylinux-source
correspondientes a su núcleo. Por ejemplo para kernel3.2.0-27-generic-pae
necesitas:linux-headers-3.2.0-27-generic-pae
ylinux-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 ejecutauname -r
y su salida es algo diferente,3.2.0-27-generic-pae
entonces debe reemplazar cada uno de los$(uname -r)
siguientes para que coincida con la cadena de versión de los paquetes instalados.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 hizocp /boot/config-$(uname -r) .config
en el directorio fuente del kernelcp /usr/src/linux-headers-$(uname -r)/Module.symvers .
en el directorio fuente del kernelDespués de hacer eso, en el directorio de origen del núcleo, haga esto:
make prepare
make scripts
make M=drivers/usb/serial
- cambia el camino luegoM=
para satisfacer tus necesidadesDesafortunadamente, no sé cómo construir un módulo específico mientras me mantengo
Module.symvers
intacto. Hacerlomake drivers/usb/serial/option.ko
, por ejemplo, mata elModule.symvers
archivo y terminas con tu problema original. El uso delM=
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.fuente
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).fuente