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