有没有一种高效的方法(也许通过滥用gcc预处理器?)来获取一个剥离了不需要的代码的内核源代码集,这些代码根据.config文件确定?
有没有一种高效的方法(也许通过滥用gcc预处理器?)来获取一个剥离了不需要的代码的内核源代码集,这些代码根据.config文件确定?
make KBUILD_VERBOSE=1 | tee build.log
grep '^ gcc' build.log
gcc <LIST OF MANY OPTIONS> -c -o kernel/kmod.o kernel/kmod.c
-c
,-o ...
并添加了-E
,从而禁用编译并将预处理器输出写入屏幕。此外,我添加了-fdirectives-only
以防止宏扩展和-undef
以删除GNU定义的宏定义。 -nostdinc
以删除标准C头文件已经由内核Makefile添加。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 '^#'
内核最小化脚本:
这个项目受到了这个问题的启发,并提供了一个简单的答案... 它包含一个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
命令,它会收缩当前的配置文件并只保留当前使用的模块,如果在“最小化”之前使用它,将生成更多精简的源代码。