linux - 根据 .config 剥离 Linux 内核源

标签 linux kernel minify c-preprocessor stripping

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

最佳答案

我们已经采取了一些步骤来解决问题。

首先可以通过以下方式获取使用到的编译命令

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 删除标准 c header 已由内核 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 中的代码。

问题仍然存在:如何对整个源代码树执行此操作?是否存在实际构建但从未在链接时使用和删除的文件?

关于linux - 根据 .config 剥离 Linux 内核源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7353640/

相关文章:

python - 如何获取进程监听的端口?

c++ - 如何检查我的输入文件是否已更新?

c - 周期性 linux 定时器的定时器到期值表示什么?

linux - ubuntu 上的内核版本不正确

kernel - 程序如何通信 - 微内核 单片内核 exo 内核

javascript - 聚合物 : vulcanizing/minifying site breaks it in Firefox

linux - manageprofiles.sh 无法创建 DEPLOYMENT MANAGER

c - Linux,kprobes/kretprobes : a way to recover [from registers?] 探测函数的参数?

javascript - GulpJS 任务在文件更改时自动缩小

javascript - 缩小/打乱 Django js 的简单方法