diff --git a/kmod/core/core.c b/kmod/core/core.c index 8c1bb37..e17234b 100644 --- a/kmod/core/core.c +++ b/kmod/core/core.c @@ -711,16 +711,15 @@ static int kpatch_link_object(struct kpatch_module *kpmod, goto err_unlink; list_for_each_entry(func, &object->funcs, list) { - unsigned long old_addr; /* calculate actual old location */ if (vmlinux) { - old_addr = func->old_offset; ret = kpatch_verify_symbol_match(func->name, - old_addr); + func->old_addr); if (ret) goto err_unlink; } else { + unsigned long old_addr; old_addr = kpatch_find_module_symbol(mod, func->name); if (!old_addr) { pr_err("unable to find symbol '%s' in module '%s\n", @@ -728,14 +727,14 @@ static int kpatch_link_object(struct kpatch_module *kpmod, ret = -EINVAL; goto err_unlink; } + func->old_addr = old_addr; } /* add to ftrace filter and register handler if needed */ - ret = kpatch_ftrace_add_func(old_addr); + ret = kpatch_ftrace_add_func(func->old_addr); if (ret) goto err_unlink; - func->old_addr = old_addr; } return 0; diff --git a/kmod/core/kpatch.h b/kmod/core/kpatch.h index be73593..7523227 100644 --- a/kmod/core/kpatch.h +++ b/kmod/core/kpatch.h @@ -36,7 +36,7 @@ struct kpatch_func { /* public */ unsigned long new_addr; unsigned long new_size; - unsigned long old_offset; + unsigned long old_addr; unsigned long old_size; const char *name; struct list_head list; @@ -44,7 +44,6 @@ struct kpatch_func { /* private */ struct hlist_node node; - unsigned long old_addr; enum kpatch_op op; }; diff --git a/kmod/patch/kpatch-patch-hook.c b/kmod/patch/kpatch-patch-hook.c index ea68878..b901c54 100644 --- a/kmod/patch/kpatch-patch-hook.c +++ b/kmod/patch/kpatch-patch-hook.c @@ -42,8 +42,7 @@ static struct kobject *functions_kobj; struct kpatch_func_obj { struct kobject kobj; - struct kpatch_patch_func *func; - char name[KSYM_NAME_LEN]; + struct kpatch_func *func; }; static struct kpatch_func_obj **func_objs = NULL; @@ -91,7 +90,7 @@ static ssize_t func_old_addr_show(struct kobject *kobj, struct kpatch_func_obj *func = container_of(kobj, struct kpatch_func_obj, kobj); - return sprintf(buf, "0x%lx\n", func->func->old_offset); + return sprintf(buf, "0x%lx\n", func->func->old_addr); } static ssize_t func_new_addr_show(struct kobject *kobj, @@ -257,7 +256,12 @@ static int patch_make_funcs_list(struct list_head *objects) func->new_addr = p_func->new_addr; func->new_size = p_func->new_size; - func->old_offset = p_func->old_offset; + + if (!strcmp("vmlinux", object->name)) + func->old_addr = p_func->old_addr; + else + func->old_addr = 0x0; + func->old_size = p_func->old_size; func->name = p_func->name; func->force = is_func_forced(func->new_addr); @@ -267,13 +271,11 @@ static int patch_make_funcs_list(struct list_head *objects) if (!func_obj) return -ENOMEM; - func_obj->func = p_func; + func_obj->func = func; func_objs[i++] = func_obj; - sprint_symbol_no_offset(func_obj->name, - p_func->old_offset); ret = kobject_add(&func_obj->kobj, functions_kobj, - "%s", func_obj->name); + "%s", func->name); if (ret) return ret; } diff --git a/kmod/patch/kpatch-patch.h b/kmod/patch/kpatch-patch.h index 7f013e9..3ce4832 100644 --- a/kmod/patch/kpatch-patch.h +++ b/kmod/patch/kpatch-patch.h @@ -25,7 +25,7 @@ struct kpatch_patch_func { unsigned long new_addr; unsigned long new_size; - unsigned long old_offset; + unsigned long old_addr; unsigned long old_size; char *name; char *objname; diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c index f868ff3..d6900a0 100644 --- a/kpatch-build/create-diff-object.c +++ b/kpatch-build/create-diff-object.c @@ -1992,7 +1992,7 @@ void kpatch_create_patches_sections(struct kpatch_elf *kelf, sym->name, result.value, result.size); /* add entry in text section */ - funcs[index].old_offset = result.value; + funcs[index].old_addr = result.value; funcs[index].old_size = result.size; funcs[index].new_size = sym->sym.st_size;