是否有任何有效的方法(可能是通过滥用 gcc 预处理器?)来获得一组剥离的内核源代码,其中根据 .config 不需要的所有代码都被遗漏了?
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 定义的宏定义。-nostdinc
内核makefile已经添加了删除标准c头文件。
现在仍然包括在内,因此在预处理器输出上进行了扩展。因此,我通过 grep 将输入文件删除:grep -v '#include' kernel/kmod.c
. 现在只剩下一个包含:autoconf.h 包含在 Makefile 的命令行中。这很棒,因为它实际上定义了用于#ifdef CONFIG_...
选择活动内核代码的宏。
剩下的唯一事情就是#define
通过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 中的代码。
问题仍然存在:如何为整个源代码树做到这一点?是否存在实际构建但在链接时从未使用和剥离的文件?
内核最小化脚本:
受此问题启发并提供简单答案的项目...它包含一个 Python 脚本,可在构建期间生成最小化的源代码。新的最小化源树将只包含使用过的源。(项目页面)
信息:
该脚本已经过测试与内核 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
命令可以仅使用当前使用的模块收缩当前配置文件,如果在“最小化”之前使用它将生成更多剥离的源
编译所有内容并使用 atime 找出未使用的文件。它可能不是很准确,但可能值得一试。