Linux 6.19 内核的 objtool 变更中已合并”klp-build”脚本,该脚本以源.patch 文件为输入,作为生成 livepatch 模块的新解决方案。这项 klp-build 工作由 Josh Poimboeuf 主导,其灵感来源于过去十年中从 out-of-tree Kpatch 项目中学到的经验。
Josh Poimboeuf 一直致力于 klp-build 项目,并在补丁系列的封面信中解释道:
“这一系列介绍了新的 objtool 功能和 klp-build 脚本,用于使用源 .patch 作为输入生成 livepatch 模块。
这建立在长期存在的 out-of-tree kpatch 项目概念之上,该项目始于 2012 年,多年来一直用于为生产内核生成 livepatch 模块。然而,这是一个完全重写,它结合了维护 kpatch 12 多年所积累的宝贵经验。”
与 kpatch-build 相比的主要改进:
– 与 objtool 集成:利用 objtool 现有的控制流图分析来帮助检测已更改的函数。
– 支持 vmlinux.o:支持后期链接对象,使其与 LTO、IBT 等兼容。
– 代码库简化:代码行数减少约 3k 行。
– 上游:不再使用树外 #ifdef 补丁,冗余代码大幅减少。
– 内部更简洁:符号/节/重定位包含的逻辑大幅简化,特殊节提取也更为简单。
– 强健的 __LINE__ 宏处理:通过引入 fix-patch-lines 脚本,向源 .patch 文件注入 #line 指令,以在编译时保留原始行号,避免因 __LINE__ 宏引起的假阳性二进制差异。
主要用户界面是 klp-build 脚本,它执行以下操作:
– 使用-function-sections 和-fdata-sections 构建原始内核,并加上 objtool 函数校验和。
– 应用.patch 文件并使用相同选项重新构建内核。
– 运行’objtool klp diff’检测更改的函数并生成中间二进制差异对象。
– 构建一个内核模块,该模块链接差异对象和部分 livepatch 模块初始化代码(scripts/livepatch/init.c)。
– 使用’objtool klp post-link’最终完成对 livepatch 模块(即解决链接器问题)的构建。”
这位 Red Hat 工程师的所有工作现已纳入 Linux 6.19 Git。内核安全更新和功能问题的 live-patching 对大型企业,尤其是对系统停机时间要求极低的超大规模企业来说,仍然是一个重要领域。

这个 objtool 拉取请求合并了新的 klp-build 以及相关的基础设施,为 Linux 内核的实时修补带来了重大改进。
转自 Linux 6.19 Merges “klp-build” As New Livepatch Module Generation Solution – Phoronix
Linuxeden开源社区