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