66 lines
2.3 KiB
Diff
66 lines
2.3 KiB
Diff
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
|
|
|