Ну, есть несколько шагов в решении.
Во-первых, можно получить использованные команды компилятора с помощью
make KBUILD_VERBOSE=1 | tee build.log
grep '^ gcc' build.log
На данный момент я выбираю только одну командную строку gcc для дальнейших шагов.Например, сборка kernel / kmod.c выглядит следующим образом:
gcc <LIST OF MANY OPTIONS> -c -o kernel/kmod.o kernel/kmod.c
Теперь я удалил параметр -c
, -o ...
и добавил -E
, отключив тем самым компиляцию и записав вывод препроцессора вэкран.Далее я добавляю -fdirectives-only
, чтобы предотвратить расширение макроса, и -undef
, чтобы удалить определения макросов, определенные в GNU.-nostdinc
для удаления стандартных заголовков c уже добавлен make-файлом ядра.
Теперь включает в себя все еще включены и, следовательно, расширены на выходе препроцессора.Таким образом я передаю входной файл через grep, удаляя их: grep -v '#include' kernel/kmod.c
.Теперь осталось только одно включение: autoconf.h включается в командной строке Makefile.Это замечательно, поскольку фактически определяет макросы, используемые #ifdef CONFIG_...
для выбора активного кода ядра.
Осталось только отфильтровать комментарии препроцессора и оставшиеся #define
s из autoconf.h с помощью grep -v '^#'
.
Весь канал выглядит так:
grep -v '#include' kernel/kmod.c | gcc -E -fdirectives-only -undef <ORIGINAL KERNEL BUILD GCC OPTIONS WITHOUT -c AND -o ...> - |grep -v '^#'
, и в результате получается отфильтрованная версия kernel / kmod.c, содержащая код, который фактически встроен в kmod.o.
Остаются вопросы: как это сделать для всего дерева исходных текстов?Существуют ли файлы, которые действительно создаются, но никогда не используются и не удаляются при связывании?