Vamos a haber escrito el siguiente archivo fuente del módulo más simple:
#include <linux/init.h> #include <linux/module.h> static int __init md_init(void){ printk("Hello kernel"); return 0; } static void __exit md_exit(void){ printk("Goodbye kernel"); } module_init(md_init); module_exit(md_exit); ¿Cómo puedo ver esta fuente después del preprocesamiento? Quiero saber cómo se implementan las macros __init y __exit y cuál es module_init(md_init) y module_exit(md_exit) ? ¿Cómo funciona?
Si tiene su controlador en el kernel, puede obtenerlo haciendo:
hacer ruta-al-módulo/srcfile.i
Como ejemplo, creé un directorio de prueba en drivers/staging/, puse su archivo allí, creé un Kconfig y Makefile simples, actualicé Kconfig y Makefile en staging, luego ejecuté
hacer controladores/puesta en escena/prueba/prueba.i
Si tiene la fuente fuera del árbol del kernel, pero tiene configurados Kconfig y Makefile, entonces:
make -C /ruta/al/kernel/src M=/ruta/al/controlador srcfile.i
El resultado fue de macros de inicio y salida:
static int __attribute__ ((__section__(".init.text"))) __attribute__((__cold__)) __attribute__((no_instrument_function)) md_init(void) { printk("Hello kernel"); return 0; } static void __attribute__ ((__section__(".exit.text"))) __attribute__((__used__)) __attribute__((__cold__)) __attribute__((no_instrument_function)) md_exit(void) { printk("Goodbye kernel"); }Si solo planea obtener la salida preprocesada del módulo del kernel, no use Makefile, porque Makefiles (sub-make) intentará producir un archivo de objeto con la capacidad de insertarse en el kernel. Lo que contradice con gcc -E , que simplemente se detiene después del preprocesamiento. Entonces, simplemente haga lo siguiente usando gcc :
gcc -E new.c -I$TREE/include -I$TREE/arch/x86/include -I$TREE/include/uapi -E es para obtener la salida preprocesada, $TREE es la ubicación de su árbol de kernel y si usa otro arco, cambie x86. Y sabemos que, gcc toma el parámetro include dir con -I , así que pase todo el kernel include dir a través de -I . ¡Espero que esto ayude!
,Para ver los archivos intermedios. es decir, los archivos .i y .s después del preprocesamiento del compilador, cambie el Makefile y agregue EXTRA_CFLAGS='-save-temps'
Makefile:
make -C /usr/lib/modules/$(shell uname -r)/build M=$(shell pwd) módulos EXTRA_CFLAGS=' -save-temps '
después de esto, una vez que ejecute 'make', puede ver your_module_filename.i en
ls /usr/lib/modules/$(uname -r)/build/{nombre_de_tu_módulo.i}
y la fuente con los cambios del preprocesador estará disponible casi al final del archivo.