From 01214c9675eba980b44886e22478b7daff88c875 Mon Sep 17 00:00:00 2001 From: Zhipeng Xie Date: Fri, 2 Nov 2018 17:25:38 +0000 Subject: [PATCH 21/38] create-diff-object: create dynamic relocs for changed functions in this object Currently, we only create dynamic relocs for changed functions of other objects, but not this object. It will cause a problem like: original: funcA and funcB (funcA calls funcB) patch-1: funcA-1 and funcB-1 (funcA-1 calls funcB-1) patch-2: funcB-2 (funcA-1 should call funcB-2) But as we don't create dynamic relocs for funcA-1, it will call funcB-1 directly (not by jumping from funcB). So the new funcB-2 will not get called. This patch will create dynamic relocs for all the changed functions, including changed ones in this object. Reported-by: Xie Zhipeng Tested-by: Zhou Chengming Signed-off-by: Zhou Chengming Signed-off-by: Li Bin Signed-off-by: Zhipeng Xie --- kpatch-build/create-diff-object.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c index 2a3a5de..5bed3e2 100644 --- a/kpatch-build/create-diff-object.c +++ b/kpatch-build/create-diff-object.c @@ -3453,6 +3453,12 @@ static bool need_klp_reloc(struct kpatch_elf *kelf, struct lookup_table *table, return false; if (rela->sym->sec) { + if (rela->sym->type == STT_FUNC && + rela->sym->status == CHANGED && + rela->sym->sec != relasec->base && + relasec->base->sym && + relasec->base->sym->type == STT_FUNC) + return true; /* * Internal symbols usually don't need klp relocations, because * they live in the patch module and can be relocated normally. -- 2.33.0