6

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

4

3 回答 3

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 中的代码。

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

于 2011-09-13T21:51:20.493 回答
1

内核最小化脚本:

受此问题启发并提供简单答案的项目...它包含一个 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命令可以仅使用当前使用的模块收缩当前配置文件,如果在“最小化”之前使用它将生成更多剥离的源

于 2018-08-13T05:34:03.663 回答
0

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

于 2011-09-08T20:13:20.013 回答