modulos modprobe modificar compilar como comando cargar linux gcc module makefile kernel

modprobe - Cómo pasar parámetros de makefile al código fuente del módulo de kernel de Linux



compilar kernel linux (3)

Tengo el código fuente:

#include <linux/module.h> #include <linux/kernel.h> int init_module(void) { printk(KERN_INFO "Hello world %i/n", BUILD_NUMBER); return 0; } void cleanup_module(void) { printk(KERN_INFO "Goodbye world 1./n"); }

y un archivo MAKE

obj-m += hello-1.o BUILD_NUMBER := 42 # How to pass BUILD_NUMBER to hello-1.c ??? all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

¿Ahora cómo paso el parámetro BUILD_NUMBER del archivo MAKE al código fuente?


Como el sistema de compilación de Linux usa kernel proporcionado Makefiles que razonablemente no se puede cambiar. Sugeriría colocar su número de versión directamente en el código fuente en lugar de en el Makefile.

Hay una posibilidad de pensamiento. Puede definir una variable de entorno CPPFLAGS . Debe ser pasado por el Makefile del núcleo a la línea de comando del compilador de C. Si define esta variable CPPFLAGS como -DVERSION=42 , tal vez pueda usar esta macro VERSION dentro de su archivo fuente.

all: CPPFLAGS="-DVERSION=42" make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

Tenga en cuenta que CPPFLAGS significa "C PreProcessor FLAGS". No está relacionado con C ++.

Después de probarlo. Esto no funciona. Sin embargo, hay una solución. El archivo Makefile del kernel permite (y usa) la definición de la variable de entorno KCPPFLAGS que se agregará al kernel Makefile definido CPPFLAGS propio.

Tienes que usar:

all: KCPPFLAGS="-DVERSION=42" make -C /lib/modules/$(shell uname -r)/build M=$(PWD)


Prueba agregar:

-DBUILD_NUMBER=$(BUILD_NUMBER)

Para tus parámetros de compilador Eso debería tener el mismo efecto que definir BUILD_NUMBER con un #define en su código.


En la línea de comandos, la manera correcta de pasar argumentos a gcc de acuerdo con la Documentación del kernel / kbuild / makefiles.txt es establecer CFLAGS_MODULE .

Por ejemplo, para compilar módulos en el directorio actual con BUILD_NUMBER=42 :

make CFLAGS_MODULE=-DBUILD_NUMBER=42 M="$PWD" modules

Si quiere proporcionar varias -D , use comillas simples:

make CFLAGS_MODULE=''-DBUILD_NUMBER=42 -DSOME_OTHER_MACRO'' M="$PWD" modules

Nota: eso no está limitado a la configuración de macros, por ejemplo, podría usar CFLAGS_MODULE=-O0 .