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>
This commit is contained in:
Josh Poimboeuf 2023-05-16 15:46:18 -07:00
parent 94bcca58e1
commit 75927e7bbb
1 changed files with 27 additions and 0 deletions

View File

@ -165,6 +165,25 @@ static bool locals_match(struct lookup_table *table, int idx,
return true;
}
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)
{
@ -184,6 +203,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)