根据.config删除Linux内核源代码

时间:2011-09-08 19:50:31

标签: linux kernel minify c-preprocessor stripping

有没有任何有效的方法(可能通过滥用gcc预处理器?)来获取一组剥离的内核源代码,其中根据.config不需要所有代码?

3 个答案:

答案 0 :(得分:3)

为解决方案做了一些步骤。

首先,可以通过

获取使用过的编译器命令
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定义的宏定义。内核makefile已添加-nostdinc删除标准c头文件。

现在包含仍然包含在内,因此在预处理器输出上进行了扩展。因此,我通过grep管道输入文件删除它们:grep -v '#include' kernel/kmod.c。现在只剩下一个include:makefile的命令行包含autoconf.h。这很棒,因为它实际上定义了#ifdef CONFIG_...用来选择活动内核代码的宏。

唯一剩下的就是通过#define从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中的代码。

问题仍然存在:如何为整个源代码树做到这一点?是否存在实际构建但从未在链接中使用和剥离的文件?

答案 1 :(得分:0)

编译所有内容并使用atime查找未使用的文件。它可能不是很准确,但它可能值得一试。

答案 2 :(得分:0)

内核最小化脚本:

受此问题启发并提供简单答案的项目... 它包含一个Python脚本,该脚本在构建期间生成最小化的源代码。新的最小化源代码树将仅包含已使用的源代码。 (project page)

信息:

该脚本已经过与内核v4.14.x一起使用的测试,但是从生成的最小化源中再次构建内核需要复制make文件和Kconfig文件等...至少我们可以轻松地隔离仅使用过的源用于调查和开发

用法:

cd /kernel/sources
make 
wget https://github.com/Hitachi-India-Pvt-Ltd-RD/minimization/raw/master/minimize.py
export PATH=$PATH:`pwd`
make C=2 CHECK=minimize.py CF="-mindir ../path-to-minimized-source-tree/"

注释和提醒:

如果我们要在目标机器内部构建并针对目标机器,我们还具有make localmodconfig命令,该命令仅使用当前使用的模块来缩小当前配置文件,如果在“最小化”之前使用,它将生成更多的剥离源