2011-09-08 8 views

Respuesta

2

Bien, tengo algunos pasos para llegar a una solución.

En primer lugar, uno puede obtener los comandos del compilador utilizados por

make KBUILD_VERBOSE=1 | tee build.log 
grep '^ gcc' build.log 

Por ahora, sólo se selecciono una línea de comando gcc para dar nuevos pasos. Por ejemplo, la acumulación de kernel/kmod.c, que parece:

gcc <LIST OF MANY OPTIONS> -c -o kernel/kmod.o kernel/kmod.c 

ahora quitar la opción -c, -o ... y añadir -E, inhabilitando así la compilación y escribir la salida del preprocesador de la pantalla. Además agrego -fdirectives-only para evitar la expansión de macro y -undef para eliminar las definiciones de macro definidas por GNU. -nostdinc para eliminar los encabezados c estándar ya ha sido agregado por el archivo MAKE MAKE.

Ahora incluye todavía están incluidos y, por tanto, ampliado en la salida del preprocesador. Por lo tanto, canalizo el archivo de entrada a través de grep eliminándolos: grep -v '#include' kernel/kmod.c. Ahora solo queda una inclusión: autoconf.h está incluida en la línea de comandos de Makefile. Esto es genial ya que realmente define las macros utilizadas por #ifdef CONFIG_... para seleccionar el código del kernel activo.

Lo único que queda es filtrar los comentarios del preprocesador y los #define restantes de autoconf.h mediante grep -v '^#'.

El conjunto de tubo se parece a:

grep -v '#include' kernel/kmod.c | gcc -E -fdirectives-only -undef <ORIGINAL KERNEL BUILD GCC OPTIONS WITHOUT -c AND -o ...> - |grep -v '^#' 

y el resultado es una versión filtrada de kernel/kmod.c que contiene el código que realmente se construye en kmod.o.

Aún quedan preguntas: ¿Cómo hacer eso para todo el árbol fuente? ¿Hay archivos que realmente se compilan pero que nunca se usaron y se eliminaron de los enlaces?

0

Compila todo y usa atime para descubrir qué archivos no se usaron. Puede que no sea muy preciso, pero probablemente valga la pena intentarlo.

+0

Esto no funcionará, ya que se evalúan muchas sentencias #ifdef ... dentro de los archivos fuente, por lo que los archivos no utilizados y los archivos casi no utilizados se compilan también. – dronus

+0

@dronus: Esa es la única manera simple en que puedo pensar (La siguiente es, básicamente, escribir o modificar un preprocesador C). Debería eliminar cosas como módulos y archivos no utilizados. ¿Realmente necesitas que sea más preciso? ¿Qué estás intentando lograr? –

+1

Bueno, me gustaría obtener una descripción general sobre cómo funciona el kernel, pero es casi imposible leer cientos de MB de código. Así que me gusta construir un kernel mínimo y leer el código real usado. – dronus

Cuestiones relacionadas