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
.