是否有任何有效的方法(可能通过滥用 gcc 预处理器?)来获取一组剥离的内核源代码,其中根据 .config 不需要的所有代码都被排除在外?
最佳答案
我们已经采取了一些步骤来解决问题。
首先可以通过以下方式获取使用到的编译命令
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 header 已由内核 makefile 添加。
现在包含仍然包含在内,因此在预处理器输出上进行了扩展。因此,我通过 grep 删除输入文件:grep -v '#include' kernel/kmod.c
。现在只剩下一个包含:autoconf.h 由 Makefile 的命令行包含。这很棒,因为它实际上定义了 #ifdef CONFIG_...
用来选择事件内核代码的宏。
唯一剩下的就是通过 grep -v '^#'
从 autoconf.h 中过滤掉预处理器注释和剩余的 #define
。
整个管道看起来像:
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 中的代码。
问题仍然存在:如何对整个源代码树执行此操作?是否存在实际构建但从未在链接时使用和删除的文件?
关于linux - 根据 .config 剥离 Linux 内核源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7353640/