70 lines
1.9 KiB
Diff
70 lines
1.9 KiB
Diff
From 75927e7bbbc81de662755cee9c2e65b975138e06 Mon Sep 17 00:00:00 2001
|
|
From: Josh Poimboeuf <jpoimboe@redhat.com>
|
|
Date: Tue, 16 May 2023 15:46:18 -0700
|
|
Subject: [PATCH] lookup: skip duplicate local symbol table check for files
|
|
without locals
|
|
|
|
If the file doesn't have local object/func symbols, any empty match will
|
|
do, and duplicate matching local symbol lists aren't a problem.
|
|
|
|
Fixes #1345.
|
|
|
|
Reported-by: lzwycc <lzw32321226@163.com>
|
|
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
|
|
|
|
Reference:https://github.com/dynup/kpatch/commit/75927e7bbbc81de662755cee9c2e65b975138e06
|
|
Conflict: change 'return true' in fun locals_match to 'return sym_num'
|
|
in count_local_symbol
|
|
---
|
|
kpatch-build/lookup.c | 27 +++++++++++++++++++++++++++
|
|
1 file changed, 27 insertions(+)
|
|
|
|
diff --git a/kpatch-build/lookup.c b/kpatch-build/lookup.c
|
|
index 875605d..458b447 100644
|
|
--- a/kpatch-build/lookup.c
|
|
+++ b/kpatch-build/lookup.c
|
|
@@ -182,6 +182,25 @@ static int count_local_symbol(struct list_head *sym_list)
|
|
return sym_num;
|
|
}
|
|
|
|
+static bool file_has_locals(struct symbol *file_sym, struct list_head *sym_list)
|
|
+{
|
|
+ struct symbol *sym = file_sym;
|
|
+
|
|
+ list_for_each_entry_continue(sym, sym_list, list) {
|
|
+ if (sym->type == STT_FILE)
|
|
+ break;
|
|
+ if (sym->type != STB_LOCAL)
|
|
+ continue;
|
|
+ if (maybe_discarded_sym(sym->name))
|
|
+ continue;
|
|
+
|
|
+ if (sym->type == STT_FUNC || sym->type == STT_OBJECT)
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ return false;
|
|
+}
|
|
+
|
|
static void find_local_syms(struct lookup_table *table, struct symbol *file_sym,
|
|
struct list_head *sym_list)
|
|
{
|
|
@@ -204,6 +223,14 @@ static void find_local_syms(struct lookup_table *table, struct symbol *file_sym,
|
|
file_sym->name, table->objname);
|
|
|
|
lookup_table_file_sym = sym;
|
|
+
|
|
+ if (!file_has_locals(file_sym, sym_list)) {
|
|
+ /*
|
|
+ * If the file doesn't have local symbols, any empty
|
|
+ * match will do. Skip the duplicate check.
|
|
+ */
|
|
+ break;
|
|
+ }
|
|
}
|
|
|
|
if (!lookup_table_file_sym)
|
|
--
|
|
2.33.0
|
|
|