From 459018cfabc65e9f29bf25476c727b4d5d8089c4 Mon Sep 17 00:00:00 2001 From: Zhipeng Xie <xiezhipeng1@huawei.com> Date: Wed, 22 Apr 2020 05:55:33 -0400 Subject: [PATCH 23/23] create-diff-object: fix duplicate symbols for vmlinux symbol pos in vmlinux may be different with runtime /proc/kallsyms, use ref_name and ref_offset method too. Signed-off-by: Zhipeng Xie <xiezhipeng1@huawei.com> --- kpatch-build/create-diff-object.c | 36 ++++++++++++++++--------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/kpatch-build/create-diff-object.c b/kpatch-build/create-diff-object.c index 4fa4488..ad5746b 100644 --- a/kpatch-build/create-diff-object.c +++ b/kpatch-build/create-diff-object.c @@ -3110,25 +3110,27 @@ static void kpatch_create_intermediate_sections(struct kpatch_elf *kelf, else { /* for modules, src is discovered at runtime */ ksyms[index].src = 0; - if (lookup_is_duplicate_symbol(table, rela->sym->name, objname, - result.pos)) { - struct lookup_refsym refsym; - - if (lookup_ref_symbol_offset(table, rela->sym->name, - &refsym, objname, &ref_offset)) - ERROR("unresolvable ambiguity on symbol %s\n", - rela->sym->name); - - /* add rela to fill in ref_name field */ - ALLOC_LINK(rela2, &krela_sec->rela->relas); - rela2->sym = strsym; - rela2->type = absolute_rela_type; - rela2->addend = offset_of_string(&kelf->strings, - refsym.name); - rela2->offset = (unsigned int)(index * sizeof(*krelas) + + } + + if (lookup_is_duplicate_symbol(table, rela->sym->name, objname, + result.pos)) { + struct lookup_refsym refsym; + + if (lookup_ref_symbol_offset(table, rela->sym->name, + &refsym, objname, &ref_offset)) + ERROR("unresolvable ambiguity on symbol %s\n", + rela->sym->name); + + /* add rela to fill in ref_name field */ + ALLOC_LINK(rela2, &krela_sec->rela->relas); + rela2->sym = strsym; + rela2->type = absolute_rela_type; + rela2->addend = offset_of_string(&kelf->strings, + refsym.name); + rela2->offset = (unsigned int)(index * sizeof(*krelas) + offsetof(struct kpatch_relocation, ref_name)); - } } + ksyms[index].pos = result.pos; ksyms[index].type = rela->sym->type; ksyms[index].bind = rela->sym->bind; -- 2.18.1