You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过debian/rules钩子实现内核源码修改后的增量编译?

如何通过debian/rules钩子实现内核源码修改后的增量编译?

嗨,我之前也踩过这个坑!其实问题根源在于Ubuntu内核的构建逻辑:它默认会把顶层源码复制到debian/build目录下完成编译,而且debian/rules binary默认会跳过重复的构建检查,所以才会出现改了代码却不重新编译的情况。下面给你几个亲测有效的解决方法:

先理清核心问题

当你第一次执行构建命令时,系统会把顶层内核源码复制到debian/build/<flavor>目录(比如你编译的是generic内核,路径就是debian/build/build-generic),之后所有编译操作都在这个目录里进行。如果你只修改了顶层的源文件,构建系统根本看不到你的改动;就算直接跑fakeroot debian/rules binary,它也会认为之前的构建产物是最新的,不会重新检查源码变化。

方法一:直接修改构建目录里的源码(最直接的增量方式)

  1. 找到debian/build下对应内核版本的源码路径,比如你改的是efifb驱动,路径就是debian/build/build-generic/drivers/video/fbdev/efifb/efifb.c
  2. 在这个文件里添加你的pr_info("hello world\n");语句并保存
  3. 运行fakeroot debian/rules build——这一步会调用底层的make,它会自动检测到源文件的改动,只重新编译修改过的efifb.o,然后重新链接内核镜像(因为是内置驱动,必须整合到vmlinuz里)
  4. 最后运行fakeroot debian/rules binary,把更新后的内核打包成deb包即可

方法二:修改顶层源码后同步到构建目录

如果你习惯在顶层源码目录修改代码,可以用官方提供的同步钩子来同步改动:

  1. 在顶层内核源码目录修改目标文件(比如drivers/video/fbdev/efifb/efifb.c)
  2. 运行fakeroot debian/rules update-build-tree——这个命令专门用来把顶层源码的改动同步到debian/build目录,覆盖旧文件
  3. 接着执行fakeroot debian/rules build binary,就能完成增量编译和打包了

补充小贴士

  • 为什么直接跑fakeroot debian/rules binary没用?因为binary目标默认依赖build,但如果之前已经执行过build,它会跳过构建检查。单独运行build会强制触发make的依赖检测,从而实现增量编译。
  • 如果你删除efifb.o还是没效果,大概率是删错了文件——要删debian/build目录下的efifb.o,而不是顶层源码里的(顶层本来就没有这个构建产物)

备注:内容来源于stack exchange,提问作者Michael Walton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 13:09:36