有没有任何有效的方法(可能通过滥用gcc预处理器?)来获取一组剥离的内核源代码,其中根据.config不需要所有代码?
答案 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
命令,该命令仅使用当前使用的模块来缩小当前配置文件,如果在“最小化”之前使用,它将生成更多的剥离源