sync from master
Signed-off-by: Wentao Fan <fanwentao@huawei.com>
This commit is contained in:
parent
bd5b5a675a
commit
0dfb225fd9
44
0024-optimize-for-out-of-tree-module.patch
Normal file
44
0024-optimize-for-out-of-tree-module.patch
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
From aef88b0908ee9d36131c63493c02359a04d1304c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Zhipeng Xie <xiezhipeng1@huawei.com>
|
||||||
|
Date: Fri, 13 Nov 2020 03:05:22 -0500
|
||||||
|
Subject: [PATCH] optimize for out of tree module
|
||||||
|
|
||||||
|
some out-of-tree modules's Module.symvers not in SRCDIR
|
||||||
|
some out-of-tree modules's obj has relative path like /xxx/./xxx.o
|
||||||
|
|
||||||
|
Signed-off-by: Zhipeng Xie <xiezhipeng1@huawei.com>
|
||||||
|
---
|
||||||
|
kpatch-build/kpatch-build | 1 +
|
||||||
|
kpatch-build/kpatch-gcc | 4 +++-
|
||||||
|
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build
|
||||||
|
index 523d5df..6238bc8 100755
|
||||||
|
--- a/kpatch-build/kpatch-build
|
||||||
|
+++ b/kpatch-build/kpatch-build
|
||||||
|
@@ -1035,6 +1035,7 @@ for i in $FILES; do
|
||||||
|
BUILDDIR="/lib/modules/$ARCHVERSION/build/"
|
||||||
|
SYMVERS_FILE="$TEMPDIR/Module.symvers"
|
||||||
|
[[ -e $SRCDIR/Module.symvers ]] && cp "$SRCDIR/Module.symvers" "$SYMVERS_FILE"
|
||||||
|
+ [[ -e $USERMODBUILDDIR/Module.symvers ]] && cp "$USERMODBUILDDIR/Module.symvers" $SYMVERS_FILE
|
||||||
|
awk '{ print $1 "\t" $2 "\t" $3 "\t" $4}' "${BUILDDIR}/Module.symvers" >> "$SYMVERS_FILE"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
diff --git a/kpatch-build/kpatch-gcc b/kpatch-build/kpatch-gcc
|
||||||
|
index 6ad6ebc..2b2490e 100755
|
||||||
|
--- a/kpatch-build/kpatch-gcc
|
||||||
|
+++ b/kpatch-build/kpatch-gcc
|
||||||
|
@@ -25,7 +25,9 @@ if [[ "$TOOLCHAINCMD" =~ "${ARCH_COMPILE}gcc" ||
|
||||||
|
|
||||||
|
[[ "$obj" = */.tmp_*.o ]] && obj="${obj/.tmp_/}"
|
||||||
|
relobj=${obj//$KPATCH_GCC_SRCDIR\//}
|
||||||
|
- case "$relobj" in
|
||||||
|
+ tmpobj=$(readlink -f $obj)
|
||||||
|
+ relobj2=${tmpobj//$KPATCH_GCC_SRCDIR\//}
|
||||||
|
+ case "$relobj2" in
|
||||||
|
*.mod.o|\
|
||||||
|
*built-in.o|\
|
||||||
|
*built-in.a|\
|
||||||
|
--
|
||||||
|
2.18.1
|
||||||
|
|
||||||
129
0025-Fix-relocation-not-resolved-when-new-functions-expor.patch
Normal file
129
0025-Fix-relocation-not-resolved-when-new-functions-expor.patch
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
From 737ab3efcde45cde5fbe43ee977fc18b6912f356 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Zhipeng Xie <xiezhipeng1@huawei.com>
|
||||||
|
Date: Sun, 22 Nov 2020 21:40:39 +0800
|
||||||
|
Subject: [PATCH] Fix relocation not resolved when new functions exported only
|
||||||
|
|
||||||
|
When no functions changed and new functions exported, kobject is not
|
||||||
|
created, so livepatch will not call klp_init_object and relocation
|
||||||
|
in new functions are not resolved.
|
||||||
|
|
||||||
|
Signed-off-by: Zhipeng Xie <xiezhipeng1@huawei.com>
|
||||||
|
---
|
||||||
|
kmod/patch/kpatch-patch.h | 4 ++++
|
||||||
|
kmod/patch/kpatch.lds.S | 6 ++++++
|
||||||
|
kmod/patch/livepatch-patch-hook.c | 19 +++++++++++++++++++
|
||||||
|
kpatch-build/create-diff-object.c | 24 ++++++++++++++++++++++++
|
||||||
|
4 files changed, 53 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/kmod/patch/kpatch-patch.h b/kmod/patch/kpatch-patch.h
|
||||||
|
index 6e39364..33f2056 100644
|
||||||
|
--- a/kmod/patch/kpatch-patch.h
|
||||||
|
+++ b/kmod/patch/kpatch-patch.h
|
||||||
|
@@ -63,6 +63,10 @@ struct kpatch_post_unpatch_callback {
|
||||||
|
void (*callback)(void *obj);
|
||||||
|
char *objname;
|
||||||
|
};
|
||||||
|
+struct kpatch_object {
|
||||||
|
+ char *objname;
|
||||||
|
+};
|
||||||
|
|
||||||
|
extern unsigned long __kpatch_force_funcs[], __kpatch_force_funcs_end[];
|
||||||
|
+extern struct kpatch_object __kpatch_objects[], __kpatch_objects_end[];
|
||||||
|
#endif /* _KPATCH_PATCH_H_ */
|
||||||
|
diff --git a/kmod/patch/kpatch.lds.S b/kmod/patch/kpatch.lds.S
|
||||||
|
index bc5de82..4c4d77b 100644
|
||||||
|
--- a/kmod/patch/kpatch.lds.S
|
||||||
|
+++ b/kmod/patch/kpatch.lds.S
|
||||||
|
@@ -47,4 +47,10 @@ SECTIONS
|
||||||
|
__kpatch_force_funcs_end = . ;
|
||||||
|
QUAD(0);
|
||||||
|
}
|
||||||
|
+ .kpatch.objects : {
|
||||||
|
+ __kpatch_objects = . ;
|
||||||
|
+ *(.kpatch.objects)
|
||||||
|
+ __kpatch_objects_end = . ;
|
||||||
|
+ QUAD(0);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
diff --git a/kmod/patch/livepatch-patch-hook.c b/kmod/patch/livepatch-patch-hook.c
|
||||||
|
index 5a0de7f..d3fb1db 100644
|
||||||
|
--- a/kmod/patch/livepatch-patch-hook.c
|
||||||
|
+++ b/kmod/patch/livepatch-patch-hook.c
|
||||||
|
@@ -249,6 +249,22 @@ static int patch_is_func_forced(unsigned long addr)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int add_kpatch_objects(void)
|
||||||
|
+{
|
||||||
|
+ struct kpatch_object *p_kpatch_object;
|
||||||
|
+ struct patch_object *object;
|
||||||
|
+
|
||||||
|
+ for (p_kpatch_object = __kpatch_objects;
|
||||||
|
+ p_kpatch_object < __kpatch_objects_end;
|
||||||
|
+ p_kpatch_object++) {
|
||||||
|
+ object = patch_find_object_by_name(p_kpatch_object->objname);
|
||||||
|
+ if (!object)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
|
||||||
|
#ifdef HAVE_CALLBACKS
|
||||||
|
static int add_callbacks_to_patch_objects(void)
|
||||||
|
@@ -382,6 +398,9 @@ static int __init patch_init(void)
|
||||||
|
if (ret)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
+ ret = add_kpatch_objects();
|
||||||
|
+ if (ret)
|
||||||
|
+ goto out;
|
||||||
|
/* past this point, only possible return code is -ENOMEM */
|
||||||
|
ret = -ENOMEM;
|
||||||
|
|
||||||
|
diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c
|
||||||
|
index fca68b8..bea758e 100644
|
||||||
|
--- a/kpatch-build/create-diff-object.c
|
||||||
|
+++ b/kpatch-build/create-diff-object.c
|
||||||
|
@@ -2553,6 +2553,27 @@ static void kpatch_create_kpatch_arch_section(struct kpatch_elf *kelf, char *obj
|
||||||
|
karch_sec->sh.sh_size = karch_sec->data->d_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void kpatch_create_kpatch_object_section(struct kpatch_elf *kelf, char *objname)
|
||||||
|
+{
|
||||||
|
+ struct symbol *strsym;
|
||||||
|
+ struct rela *rela;
|
||||||
|
+ struct section *kobj_sec;
|
||||||
|
+
|
||||||
|
+ kobj_sec = create_section_pair(kelf, ".kpatch.objects", sizeof(struct kpatch_object), 1);
|
||||||
|
+
|
||||||
|
+ /* lookup strings symbol */
|
||||||
|
+ strsym = find_symbol_by_name(&kelf->symbols, ".kpatch.strings");
|
||||||
|
+ if (!strsym)
|
||||||
|
+ ERROR("can't find .kpatch.strings symbol");
|
||||||
|
+
|
||||||
|
+ /* entries[index].objname */
|
||||||
|
+ ALLOC_LINK(rela, &kobj_sec->rela->relas);
|
||||||
|
+ rela->sym = strsym;
|
||||||
|
+ rela->type = absolute_rela_type;
|
||||||
|
+ rela->addend = offset_of_string(&kelf->strings, objname);
|
||||||
|
+ rela->offset = (unsigned int)(offsetof(struct kpatch_object, objname));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void kpatch_process_special_sections(struct kpatch_elf *kelf)
|
||||||
|
{
|
||||||
|
struct special_section *special;
|
||||||
|
@@ -3710,6 +3731,9 @@ int main(int argc, char *argv[])
|
||||||
|
kpatch_create_intermediate_sections(kelf_out, lookup, parent_name, patch_name);
|
||||||
|
kpatch_create_kpatch_arch_section(kelf_out, parent_name);
|
||||||
|
kpatch_create_callbacks_objname_rela(kelf_out, parent_name);
|
||||||
|
+ if (!num_changed && new_globals_exist) {
|
||||||
|
+ kpatch_create_kpatch_object_section(kelf_out, parent_name);
|
||||||
|
+ }
|
||||||
|
kpatch_build_strings_section_data(kelf_out);
|
||||||
|
|
||||||
|
gcc_add_option = getenv("GCC_ADD_OPTION");
|
||||||
|
--
|
||||||
|
2.18.1
|
||||||
|
|
||||||
110
0026-support-remove-static-variables-using-KPATCH_IGNORE_.patch
Normal file
110
0026-support-remove-static-variables-using-KPATCH_IGNORE_.patch
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
From 0e08aa99583573953367d5c1ec21901325c7faee Mon Sep 17 00:00:00 2001
|
||||||
|
From: Zhipeng Xie <xiezhipeng1@huawei.com>
|
||||||
|
Date: Wed, 30 Dec 2020 21:13:10 -0500
|
||||||
|
Subject: [PATCH] support remove static variables using KPATCH_IGNORE_STATIC
|
||||||
|
|
||||||
|
Static variables will be removed due to compiler optimization.
|
||||||
|
And some static variables can be treated as new variables, such as
|
||||||
|
static variables in print limit macros. So add KPATCH_IGNORE_STATIC
|
||||||
|
to tell kpatch to treat the static variables as new variables.
|
||||||
|
|
||||||
|
Signed-off-by: Zhipeng Xie <xiezhipeng1@huawei.com>
|
||||||
|
---
|
||||||
|
kmod/patch/kpatch-macros.h | 3 +++
|
||||||
|
kpatch-build/create-diff-object.c | 45 ++++++++++++++++++++++++++++++-
|
||||||
|
2 files changed, 47 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/kmod/patch/kpatch-macros.h b/kmod/patch/kpatch-macros.h
|
||||||
|
index a60a267..9a30d68 100644
|
||||||
|
--- a/kmod/patch/kpatch-macros.h
|
||||||
|
+++ b/kmod/patch/kpatch-macros.h
|
||||||
|
@@ -5,6 +5,9 @@
|
||||||
|
#include <linux/jiffies.h>
|
||||||
|
#include <linux/version.h>
|
||||||
|
|
||||||
|
+#define KPATCH_IGNORE_STATIC(_static) \
|
||||||
|
+ char *__UNIQUE_ID(kpatch_ignore_static_) __section(.kpatch.ignore.statics) = _static;
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* KPATCH_IGNORE_SECTION macro
|
||||||
|
*
|
||||||
|
diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c
|
||||||
|
index a2a9cab..211ea72 100644
|
||||||
|
--- a/kpatch-build/create-diff-object.c
|
||||||
|
+++ b/kpatch-build/create-diff-object.c
|
||||||
|
@@ -1151,6 +1151,40 @@ static int kpatch_is_normal_static_local(struct symbol *sym)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int kpatch_mark_ignored_statics(struct kpatch_elf *kelf, struct symbol *sym)
|
||||||
|
+{
|
||||||
|
+ struct section *sec, *strsec;
|
||||||
|
+ struct rela *rela;
|
||||||
|
+ char *name;
|
||||||
|
+
|
||||||
|
+ sec = find_section_by_name(&kelf->sections, ".kpatch.ignore.statics");
|
||||||
|
+ if (!sec)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ list_for_each_entry(rela, &sec->rela->relas, list) {
|
||||||
|
+ strsec = rela->sym->sec;
|
||||||
|
+ strsec->status = CHANGED;
|
||||||
|
+ /*
|
||||||
|
+ * Include the string section here. This is because the
|
||||||
|
+ * KPATCH_IGNORE_STATIC() macro is passed a literal string
|
||||||
|
+ * by the patch author, resulting in a change to the string
|
||||||
|
+ * section. If we don't include it, then we will potentially
|
||||||
|
+ * get a "changed section not included" error in
|
||||||
|
+ * kpatch_verify_patchability() if no other function based change
|
||||||
|
+ * also changes the string section. We could try to exclude each
|
||||||
|
+ * literal string added to the section by KPATCH_IGNORE_STATIC()
|
||||||
|
+ * from the section data comparison, but this is a simpler way.
|
||||||
|
+ */
|
||||||
|
+ strsec->include = 1;
|
||||||
|
+ strsec->secsym->include = 1;
|
||||||
|
+ name = strsec->data->d_buf + rela->addend;
|
||||||
|
+ if (!strncmp(name, sym->name, strlen(name)))
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* gcc renames static local variables by appending a period and a number. For
|
||||||
|
* example, __foo could be renamed to __foo.31452. Unfortunately this number
|
||||||
|
@@ -1230,6 +1264,11 @@ static void kpatch_correlate_static_local_variables(struct kpatch_elf *base,
|
||||||
|
if (sym->twin)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
+ if (kpatch_mark_ignored_statics(patched, sym)) {
|
||||||
|
+ log_normal("KPATCH_IGNORE_STATIC:ignore static variable %s\n", sym->name);
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
bundled = sym == sym->sec->sym;
|
||||||
|
if (bundled && sym->sec == sec->base) {
|
||||||
|
/*
|
||||||
|
@@ -1286,6 +1325,11 @@ static void kpatch_correlate_static_local_variables(struct kpatch_elf *base,
|
||||||
|
if (!kpatch_is_normal_static_local(sym))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
+ if (kpatch_mark_ignored_statics(patched, sym)) {
|
||||||
|
+ log_normal("KPATCH_IGNORE_STATIC:ignore static variable %s\n", sym->name);
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (!sym->twin || !sec->twin)
|
||||||
|
DIFF_FATAL("reference to static local variable %s in %s was removed",
|
||||||
|
sym->name,
|
||||||
|
@@ -1329,7 +1373,6 @@ static void kpatch_correlate_static_local_variables(struct kpatch_elf *base,
|
||||||
|
log_normal("WARNING: unable to correlate static local variable %s used by %s, assuming variable is new\n",
|
||||||
|
sym->name,
|
||||||
|
kpatch_section_function_name(sec));
|
||||||
|
- return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.18.1
|
||||||
|
|
||||||
172
README.md
Normal file
172
README.md
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
openEuler内核热补丁使用指南
|
||||||
|
----------
|
||||||
|
|
||||||
|
支持操作系统:
|
||||||
|
|
||||||
|
openEuler 20.03 LTS及以上版本
|
||||||
|
|
||||||
|
openEuler社区已经验证支持内核热补丁的架构:
|
||||||
|
|
||||||
|
- [x] x86_64
|
||||||
|
- [x] arm64
|
||||||
|
- [ ] ppc64le
|
||||||
|
- [ ] s390
|
||||||
|
- [ ] risc-v
|
||||||
|
|
||||||
|
上游社区:
|
||||||
|
|
||||||
|
https://github.com/dynup/kpatch
|
||||||
|
|
||||||
|
## 环境准备
|
||||||
|
|
||||||
|
安装依赖软件包
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yum install -y make gcc patch bison flex openssl-devel kpatch kpatch-runtime
|
||||||
|
```
|
||||||
|
|
||||||
|
安装当前内核源码和开发包
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yum install -y kernel-source-`uname -r` kernel-debuginfo-`uname -r` kernel-devel-`uname -r`
|
||||||
|
```
|
||||||
|
|
||||||
|
进入热补丁制作目录并准备环境
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/patch_workspace
|
||||||
|
rm -rf kernel-source .config
|
||||||
|
ln -s /usr/src/linux-`uname -r`/ kernel-source
|
||||||
|
ln -s /usr/src/linux-`uname -r`/.config .config
|
||||||
|
ln -s /usr/lib/debug/lib/modules/`uname -r`/vmlinux vmlinux
|
||||||
|
```
|
||||||
|
|
||||||
|
## 制作内核热补丁
|
||||||
|
|
||||||
|
支持两种方式制作内核热补丁
|
||||||
|
|
||||||
|
### 方法1:直接修改源代码的方式
|
||||||
|
|
||||||
|
进入内核源码目录(下面以修改fs/proc/cmdline.c文件为例)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd kernel-source
|
||||||
|
cd fs/proc/
|
||||||
|
cp cmdline.c cmdline.c.new
|
||||||
|
```
|
||||||
|
此处cp操作的后缀.new在后面执行make_hotpatch时会用到
|
||||||
|
|
||||||
|
修改cmdline.c.new中的函数
|
||||||
|
|
||||||
|
开始制作热补丁
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/patch_workspace/
|
||||||
|
./make_hotpatch -d .new -i cmdline
|
||||||
|
```
|
||||||
|
|
||||||
|
参数 | 说明|
|
||||||
|
--------- | --------|
|
||||||
|
-d |前面cp操作时的唯一后缀名|
|
||||||
|
-i |补丁ID,可包括字母和数字|
|
||||||
|
|
||||||
|
### 方法2:通过patch文件的方式
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/patch_workspace/
|
||||||
|
./make_hotpatch -i cmdline -p cmdline.patch
|
||||||
|
```
|
||||||
|
|
||||||
|
参数 | 说明|
|
||||||
|
--------- | --------|
|
||||||
|
-i |补丁ID,可包括字母和数字|
|
||||||
|
-p |patch文件路径(patch文件必须支持在kernel-source路径下通过patch -p1的方式修改源码)|
|
||||||
|
|
||||||
|
补丁制作完成,补丁文件以压缩包的格式存放于/opt/patch_workspace/hotpatch目录下
|
||||||
|
|
||||||
|
|
||||||
|
## 制作第三方模块热补丁
|
||||||
|
|
||||||
|
|
||||||
|
支持两种方式制作第三方模块热补丁
|
||||||
|
|
||||||
|
### 方法1:直接修改源代码的方式
|
||||||
|
|
||||||
|
进入模块源码目录(下面以https://gitee.com/openeuler/prefetch_tuning模块为例)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://gitee.com/openeuler/prefetch_tuning
|
||||||
|
cd prefetch_tuning
|
||||||
|
cp prefetch_mod.c prefetch_mod.c.new
|
||||||
|
```
|
||||||
|
|
||||||
|
此处cp操作的后缀.new在后面执行make_hotpatch时会用到
|
||||||
|
|
||||||
|
修改prefetch_mod.c.new中的函数
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/patch_workspace/
|
||||||
|
./make_hotpatch -d .new -i testmod -m `pwd`/prefetch_tuning/
|
||||||
|
```
|
||||||
|
|
||||||
|
参数 | 说明|
|
||||||
|
--------- | --------|
|
||||||
|
-d |前面cp操作时的唯一后缀名|
|
||||||
|
-i |补丁ID,可包括字母和数字|
|
||||||
|
-m |第三方模块源码路径|
|
||||||
|
-f |可选,当第三方模块Makefile不在-m指定的源码目录下时,通过该参数指定Makefile的绝对路径|
|
||||||
|
|
||||||
|
### 方法2:通过patch文件的方式
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/patch_workspace/
|
||||||
|
./make_hotpatch -i testmod -m `pwd`/prefetch_tuning/ -p testmod.patch
|
||||||
|
```
|
||||||
|
|
||||||
|
参数 | 说明|
|
||||||
|
--------- | --------|
|
||||||
|
-i |补丁ID,可包括字母和数字|
|
||||||
|
-m |第三方模块源码路径|
|
||||||
|
-p |patch文件路径(patch文件必须支持在-m参数指定的路径下通过patch -p1的方式修改源码)|
|
||||||
|
-f |可选,当第三方模块Makefile不在-m指定的源码目录下时,通过该参数指定Makefile的绝对路径|
|
||||||
|
|
||||||
|
第三方模块补丁补丁制作完成,补丁文件以压缩包的格式存放于/opt/patch_workspace/hotpatch目录下
|
||||||
|
|
||||||
|
## 管理热补丁
|
||||||
|
|
||||||
|
### 加载热补丁
|
||||||
|
|
||||||
|
```bash
|
||||||
|
livepatch -l klp_cmdline.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
### 激活热补丁
|
||||||
|
|
||||||
|
```bash
|
||||||
|
livepatch -a cmdline
|
||||||
|
```
|
||||||
|
|
||||||
|
此时热补丁已生效,缺陷函数已被修复。
|
||||||
|
|
||||||
|
### 回退热补丁
|
||||||
|
|
||||||
|
```bash
|
||||||
|
livepatch -d cmdline
|
||||||
|
```
|
||||||
|
|
||||||
|
### 卸载热补丁
|
||||||
|
|
||||||
|
```bash
|
||||||
|
livepatch -r cmdline
|
||||||
|
```
|
||||||
|
|
||||||
|
## 编译更新补丁工具
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yum install -y git rpm-build elfutils-libelf-devel uname-build-checks gdb-headless
|
||||||
|
git clone https://gitee.com/src-openeuler/kpatch.git
|
||||||
|
mkdir -p ~/rpmbuild/SOURCES/
|
||||||
|
/bin/cp kpatch/* ~/rpmbuild/SOURCES/
|
||||||
|
rpmbuild -ba kpatch/kpatch.spec
|
||||||
|
rpm -Uvh ~/rpmbuild/RPMS/`arch`/kpatch*.rpm
|
||||||
|
```
|
||||||
49
kpatch.spec
49
kpatch.spec
@ -1,7 +1,7 @@
|
|||||||
Name: kpatch
|
Name: kpatch
|
||||||
Epoch: 1
|
Epoch: 1
|
||||||
Version: 0.9.1
|
Version: 0.9.1
|
||||||
Release: 6
|
Release: 12
|
||||||
Summary: A Linux dynamic kernel patching infrastructure
|
Summary: A Linux dynamic kernel patching infrastructure
|
||||||
|
|
||||||
License: GPLv2
|
License: GPLv2
|
||||||
@ -35,9 +35,12 @@ Patch0020:0020-kpatch-build-add-compile-flag-fno-reorder-functions.patch
|
|||||||
Patch0021:0021-kpatch-build-don-t-copy-.config-for-out-of-tree-modu.patch
|
Patch0021:0021-kpatch-build-don-t-copy-.config-for-out-of-tree-modu.patch
|
||||||
Patch0022:0022-support-force-enable-disable-for-x86.patch
|
Patch0022:0022-support-force-enable-disable-for-x86.patch
|
||||||
Patch0023:0023-create-diff-object-fix-duplicate-symbols-for-vmlinux.patch
|
Patch0023:0023-create-diff-object-fix-duplicate-symbols-for-vmlinux.patch
|
||||||
|
Patch0024:0024-optimize-for-out-of-tree-module.patch
|
||||||
|
Patch0025:0025-Fix-relocation-not-resolved-when-new-functions-expor.patch
|
||||||
|
Patch0026:0026-support-remove-static-variables-using-KPATCH_IGNORE_.patch
|
||||||
|
|
||||||
BuildRequires: gcc elfutils-libelf-devel uname-build-checks kernel-devel git
|
BuildRequires: gcc elfutils-libelf-devel uname-build-checks kernel-devel git
|
||||||
Requires: bc
|
Requires: bc make gcc patch bison flex openssl-devel
|
||||||
Recommends: %{name}-help = %{version}-%{release}
|
Recommends: %{name}-help = %{version}-%{release}
|
||||||
|
|
||||||
%description
|
%description
|
||||||
@ -94,7 +97,43 @@ popd
|
|||||||
%{_mandir}/man1/*.1.gz
|
%{_mandir}/man1/*.1.gz
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Thu Nov 22 2020 Zhipeng Xie<xiezhipeng1@huawei.com> -1:0.9.1-6
|
* Wed Feb 10 2021 Zhipeng Xie<xiezhipeng1@huawei.com> -1:0.9.1-12
|
||||||
|
- Type:enhancement
|
||||||
|
- ID:NA
|
||||||
|
- SUG:NA
|
||||||
|
- DESC:modify hotpatch id length limit from 20 to 32
|
||||||
|
|
||||||
|
* Mon Jan 11 2021 Zhipeng Xie<xiezhipeng1@huawei.com> -1:0.9.1-11
|
||||||
|
- Type:enhancement
|
||||||
|
- ID:NA
|
||||||
|
- SUG:NA
|
||||||
|
- DESC:add kpatch requires
|
||||||
|
|
||||||
|
* Tue Jan 5 2021 Zhipeng Xie<xiezhipeng1@huawei.com> -1:0.9.1-10
|
||||||
|
- Type:enhancement
|
||||||
|
- ID:NA
|
||||||
|
- SUG:NA
|
||||||
|
- DESC:only skip gcc check in cross compile environment
|
||||||
|
|
||||||
|
* Thu Dec 31 2020 Zhipeng Xie<xiezhipeng1@huawei.com> -1:0.9.1-9
|
||||||
|
- Type:enhancement
|
||||||
|
- ID:NA
|
||||||
|
- SUG:NA
|
||||||
|
- DESC:support remove static variables using KPATCH_IGNORE_STATIC
|
||||||
|
|
||||||
|
* Sun Nov 22 2020 Zhipeng Xie<xiezhipeng1@huawei.com> -1:0.9.1-8
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:NA
|
||||||
|
- DESC:Fix relocation not resolved when new functions exported only
|
||||||
|
|
||||||
|
* Tue Nov 17 2020 Zhipeng Xie<xiezhipeng1@huawei.com> -1:0.9.1-7
|
||||||
|
- Type:enhancement
|
||||||
|
- ID:NA
|
||||||
|
- SUG:NA
|
||||||
|
- DESC:optimize for out of tree module
|
||||||
|
|
||||||
|
* Thu Nov 12 2020 Zhipeng Xie<xiezhipeng1@huawei.com> -1:0.9.1-6
|
||||||
- Type:enhancement
|
- Type:enhancement
|
||||||
- ID:NA
|
- ID:NA
|
||||||
- SUG:NA
|
- SUG:NA
|
||||||
@ -185,7 +224,7 @@ popd
|
|||||||
- SUG:restart
|
- SUG:restart
|
||||||
- DESC:add security compile flags
|
- DESC:add security compile flags
|
||||||
|
|
||||||
* Tue Sep 27 2019 Zhipeng Xie<xiezhipeng1@huawei.com> - 2.0-3.1.17
|
* Fri Sep 27 2019 Zhipeng Xie<xiezhipeng1@huawei.com> - 2.0-3.1.17
|
||||||
- Type:enhancement
|
- Type:enhancement
|
||||||
- ID:NA
|
- ID:NA
|
||||||
- SUG:restart
|
- SUG:restart
|
||||||
@ -209,7 +248,7 @@ popd
|
|||||||
- SUG:NA
|
- SUG:NA
|
||||||
- DESC:rewrite spec
|
- DESC:rewrite spec
|
||||||
|
|
||||||
* Fri Jul 16 2019 yangbin<robin.yb@huawei.com> - 2.0-3.1.13
|
* Tue Jul 16 2019 yangbin<robin.yb@huawei.com> - 2.0-3.1.13
|
||||||
- Type:enhancement
|
- Type:enhancement
|
||||||
- ID:NA
|
- ID:NA
|
||||||
- SUG:restart
|
- SUG:restart
|
||||||
|
|||||||
@ -154,7 +154,7 @@ function fn_check_reg_char()
|
|||||||
function fn_check_id()
|
function fn_check_id()
|
||||||
{
|
{
|
||||||
local l_id=$1
|
local l_id=$1
|
||||||
fn_check_reg_char "$l_id" "20" "-_"
|
fn_check_reg_char "$l_id" "32" "-_"
|
||||||
if [ $? -ne 0 ];then
|
if [ $? -ne 0 ];then
|
||||||
echo "error: check hotpatch id failed"
|
echo "error: check hotpatch id failed"
|
||||||
return 1
|
return 1
|
||||||
@ -592,7 +592,14 @@ function fn_makepatch()
|
|||||||
export USERMODFLAGS=`cat $G_KPATCH_FLAGS`
|
export USERMODFLAGS=`cat $G_KPATCH_FLAGS`
|
||||||
export NO_PROFILING_CALLS="yes"
|
export NO_PROFILING_CALLS="yes"
|
||||||
export DISABLE_AFTER_LOAD="yes"
|
export DISABLE_AFTER_LOAD="yes"
|
||||||
kpatch-build -s $G_PATCH_SRC -c $G_KERNEL_CONFIG -v $G_VMLINUX --skip-gcc-check -n "${G_PREFIX}_${G_HOTPATCH_ID}" $G_DEBUG_INFO $G_PATCHFILE
|
UNAME_R=$(uname -r)
|
||||||
|
UNAME_R_ARCH=${UNAME_R##*.}
|
||||||
|
SKIP_GCC_CHECK=""
|
||||||
|
if [[ "${UNAME_R_ARCH}" != "$(uname -p)" ]];then
|
||||||
|
echo "build in cross compile environment, skip gcc check"
|
||||||
|
SKIP_GCC_CHECK="--skip-gcc-check"
|
||||||
|
fi
|
||||||
|
kpatch-build -s $G_PATCH_SRC -c $G_KERNEL_CONFIG -v $G_VMLINUX ${SKIP_GCC_CHECK} -n "${G_PREFIX}_${G_HOTPATCH_ID}" $G_DEBUG_INFO $G_PATCHFILE
|
||||||
l_ret=$?
|
l_ret=$?
|
||||||
cd - &>/dev/null
|
cd - &>/dev/null
|
||||||
if [ $l_ret -eq 0 ] && [ -f "$G_TMP_DIR/$G_HOTPATCH" ];then
|
if [ $l_ret -eq 0 ] && [ -f "$G_TMP_DIR/$G_HOTPATCH" ];then
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user