From 2de1633802ae3bc2c4f91e536dbba830da6ad932 Mon Sep 17 00:00:00 2001 From: Zhipeng Xie Date: Fri, 2 Nov 2018 17:25:38 +0000 Subject: [PATCH 21/37] 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 deddde9..5e216d1 100644 --- a/kpatch-build/create-diff-object.c +++ b/kpatch-build/create-diff-object.c @@ -3309,6 +3309,12 @@ static bool need_dynrela(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 dynrelas, because they * live in the patch module and can be relocated normally. -- 2.33.0