根据.config文件削减Linux内核源代码

6

有没有一种高效的方法(也许通过滥用gcc预处理器?)来获取一个剥离了不需要的代码的内核源代码集,这些代码根据.config文件确定?

3个回答

3
“好的,已经有一些解决方案了。首先,可以通过以下方式获得所使用的编译器命令:”
make KBUILD_VERBOSE=1 | tee build.log
grep '^  gcc' build.log

目前,我只选择一个gcc命令行进行进一步的步骤。例如,对于内核/kmod.c的构建,它看起来像这样:
gcc <LIST OF MANY OPTIONS> -c -o kernel/kmod.o kernel/kmod.c

我现在移除了选项-c-o ...并添加了-E,从而禁用编译并将预处理器输出写入屏幕。此外,我添加了-fdirectives-only以防止宏扩展和-undef以删除GNU定义的宏定义。 -nostdinc以删除标准C头文件已经由内核Makefile添加。
现在,包含文件仍然被包含并因此在预处理器输出上扩展。因此,我通过grep将输入文件传递并将其删除:grep -v '#include' kernel/kmod.c。现在只剩下一个包含:autoconf.h由Makefile的命令行包含。这很棒,因为它实际上定义了由#ifdef CONFIG_...用于选择活动内核代码的宏。
唯一剩下的就是通过grep -v '^#'过滤掉autoconf.h中的预处理器注释和剩余的#define
整个管道看起来像:
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

内核最小化脚本:

这个项目受到了这个问题的启发,并提供了一个简单的答案... 它包含一个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命令,它会收缩当前的配置文件并只保留当前使用的模块,如果在“最小化”之前使用它,将生成更多精简的源代码。


哇,我得去研究一下。 - dronus

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

1
这样做不起作用,因为许多 #ifdef... 语句在源文件中被评估,因此未使用的文件和几乎未使用的文件也会被编译。 - dronus
@dronus:这是我能想到的唯一简单的方法(下一个方法基本上是编写或修改C预处理器)。它应该会删除未使用的模块和架构。你真的需要更精确吗?你想要实现什么目标? - Piotr Praszmo
2
我只是想了解内核的工作原理,但是阅读数百兆字节的代码几乎是不可能的。因此,我想构建一个最小的内核并阅读其中真正使用的代码,以获得可靠的概述。 - dronus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接