Inspired by KPATCH @ https://github.com/dynup/kpatch. Many thanks!
Klpmake 是Linux内核热补丁制作工具,它调用编译工具链,将用户的补丁文件生成为“部分链接”的目标文件,对其中的Livepatch Symbols -- non-exported global symbols and non-included local symbols
进行修正,最终生成符合Livepatch module ELF format的内核模块。
Klpmake以内核samples/livepatch/livepatch-sample.c
为模板,通过.patch文件自动生成补丁模块源码。再通过内核和模块DWARF信息及/proc/kallsyms
、/proc/modules
,可靠解析定位Livepatch Symbols
。制作时不编译内核,不深入hacking ELF格式,也基本架构无关。
Klpmake小、简单、快,支持对内核及已加载的模块打补丁。
当前主要针对的是openEuler操作系统。
软件依赖libdwarf(>=0.8.0)、libclang、elfutils-libelf(gelf)、bash及一些coreutils工具。运行时需要内核/模块源码、debuginfo文件(DWARF4格式)。热补丁模块制作过程与常规模块基本相同,需要内核的编译构建基础设施。一些依赖库的安装命令:
sudo dnf install clang-libs clang-devel libdwarf-devel elfutils-libelf-devel bash
不同的发行版,软件安装的目录可能不同。在编译klpmake前请检查并修改当前还很简陋的config.h和Makefile内容,然后:
make
Klpmake由klpmake(主入口)、klpsrc、fixklp三个可执行文件组成。
创建工作目录,目录名将作为热补丁的模块名;将补丁文件放到工作目录下,执行:
sudo klpmake-dir/klpmake -s source-tree-root -b debuginfo-tree-root
source-tree-root是源码树根目录,debuginfo-tree-root是包含debuginfo文件的根目录,如vmlinux、*.ko.debug等。
建议分步执行klpmake,这样可以检查确认每步的结果是否正确是否符合预期,并可以根据需要增加hook功能等。用法见klpmake的Usage。
见example。
社区有对DWARF信息可靠性的担心,这里列出klpmake用到的:
用tools目录下的工具,比对vmlinux中的DWARF和kallsyms中的变量名字、地址:
架构 | kallsyms数量(非t/T) | DWARF数量 | DWARF不匹配kallsyms数量 | kallsyms去掉.xxx后 |
---|---|---|---|---|
x86-64 | 49919 | 28989 | 5846 | 305 |
riscv64 | 53100 | 44225 | 5710 | 25 |
aarch64 | 46259 | 25680 | 5202 | 47 |
因为函数内定义的static变量名字会后缀.123,因此单纯从数量上看,不匹配率基本小于1%。具体分析,DWARF会生成一些弱符号的地址,,
工具是在riscv64平台上开发和测试的,刚刚迈出一小步...
非常期待你的试用与反馈!非常欢迎hacker来指点贡献!
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。