dro*_*nus 6 linux kernel minify stripping c-preprocessor
是否有任何有效的方法(可能通过滥用gcc预处理器?)来获取一组剥离的内核源代码,其中根据.config不需要的所有代码都被省略了?
好吧,我们采取了一些解决方案。
首先,可以通过以下方式获取所使用的编译器命令
make KBUILD_VERBOSE=1 | tee build.log
grep '^ gcc' build.log
Run Code Online (Sandbox Code Playgroud)
目前,我仅选择一个 gcc 命令行来执行进一步的步骤。例如 kernel/kmod.c 的构建,如下所示:
gcc <LIST OF MANY OPTIONS> -c -o kernel/kmod.o kernel/kmod.c
Run Code Online (Sandbox Code Playgroud)
我现在删除该选项-c
,-o ...
并添加-E
,从而禁用编译并将预处理器输出写入屏幕。此外,我添加了-fdirectives-only
防止宏扩展并-undef
删除 GNU 定义的宏定义。-nostdinc
内核 makefile 已经添加了删除标准 C 头文件的功能。
现在,包含仍然包含在内,因此在预处理器输出上进行了扩展。因此,我通过 grep 管道输入文件删除它们:grep -v '#include' kernel/kmod.c
。现在只剩下一个包含:autoconf.h 由 Makefile 的命令行包含。这很棒,因为它实际上定义了用于#ifdef CONFIG_...
选择活动内核代码的宏。
#define
剩下的唯一事情就是通过 的方式从 autoconf.h 中过滤掉预处理器注释和剩余的s grep -v '^#'
。
整个管道看起来像:
grep -v '#include' kernel/kmod.c | gcc -E -fdirectives-only -undef <ORIGINAL KERNEL BUILD GCC OPTIONS WITHOUT -c AND -o ...> - |grep -v '^#'
Run Code Online (Sandbox Code Playgroud)
结果是 kernel/kmod.c 的过滤版本,其中包含实际构建到 kmod.o 中的代码。
问题仍然存在:如何对整个源树执行此操作?是否存在实际构建但从未使用并在链接时被剥离的文件?