A veces tiene sentido dividir el módulo del núcleo en varios ficheros de código. En este caso, tienes que hacer lo siguiente:
He aquí un ejemplo de módulo de este tipo.
/* start.c
* Copyright (C) 1999 by Ori Pomerantz
*
* "Hola, mundo" - la versión módulo del núcleo.
* Este fichero incluye justamente la rutina de comienzo
*/
/* Los ficheros de cabeceras necesarios */
/* Estándar en los módulos del núcleo */
#include <linux/kernel.h> /* Estamos haciendo trabajo del núcleo */
#include <linux/module.h> /* Específicamente, un módulo */
/* Distribuido con CONFIG_MODVERSIONS */
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endif
/* Inicializa el módulo */
int init_module()
{
printk("Hola, mundo - este es el núcleo hablando\n");
/* Si retornamos un valor distinto de cero, significa
* que init_module falló y el módulo del núcleo
* no puede ser cargado */
return 0;
}
/* stop.c
* Copyright (C) 1999 by Ori Pomerantz
*
* "Hola, mundo" - la versión módulo del núcleo. Este
* fichero incluye justamente la rutina de parada.
*/
/* Los ficheros de cabeceras necesarios */
/* Estándar en los módulos del núcleo */
#include <linux/kernel.h> /* Estamos haciendo trabajo del núcleo */
#define __NO_VERSION__ /* Este no es "el" fichero
* del módulo del núcleo */
#include <linux/module.h> /* Específicamente, un módulo */
#include <linux/version.h> /* No incluido por
* module.h debido
* a __NO_VERSION__ */
/* Distribuido con CONFIG_MODVERSIONS */
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endif
/* Limpieza - deshacemos todo aquello que hizo init_module */
void cleanup_module()
{
printk("La vida de un módulo del núcleo es corta\n");
}
# Makefile para un módulo multiarchivo del núcleo CC=gcc MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX hello.o: start.o stop.o ld -m elf_i386 -r -o hello.o start.o stop.o start.o: start.c /usr/include/linux/version.h $(CC) $(MODCFLAGS) -c start.c stop.o: stop.c /usr/include/linux/version.h $(CC) $(MODCFLAGS) -c stop.c