objtool/klp: Fix --debug-checksum for duplicate symbol names

find_symbol_by_name() only returns the first match, so
--debug-checksum=<func> silently ignores any subsequent duplicately
named functions after the first.

Fix that, along with a new for_each_sym_by_name() helper.

Acked-by: Song Liu <song@kernel.org>
Reviewed-by: Miroslav Benes <mbenes@suse.cz>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
This commit is contained in:
Josh Poimboeuf 2026-03-30 21:31:47 -07:00
parent 0333b73995
commit def5b60dcd
2 changed files with 15 additions and 5 deletions

View File

@ -3677,18 +3677,23 @@ static int checksum_debug_init(struct objtool_file *file)
s = dup;
while (*s) {
struct symbol *func;
bool found = false;
struct symbol *sym;
char *comma;
comma = strchr(s, ',');
if (comma)
*comma = '\0';
func = find_symbol_by_name(file->elf, s);
if (!func || !is_func_sym(func))
for_each_sym_by_name(file->elf, s, sym) {
if (!is_func_sym(sym))
continue;
sym->debug_checksum = 1;
found = true;
}
if (!found)
WARN("--debug-checksum: can't find '%s'", s);
else
func->debug_checksum = 1;
if (!comma)
break;

View File

@ -489,6 +489,11 @@ static inline void set_sym_next_reloc(struct reloc *reloc, struct reloc *next)
#define for_each_sym_continue(elf, sym) \
list_for_each_entry_continue(sym, &elf->symbols, global_list)
#define for_each_sym_by_name(elf, _name, sym) \
elf_hash_for_each_possible(elf, symbol_name, sym, name_hash, \
str_hash_demangled(_name)) \
if (strcmp(sym->name, _name)) {} else
#define for_each_sym_by_demangled_name(elf, name, sym) \
elf_hash_for_each_possible(elf, symbol_name, sym, name_hash, \
str_hash(name)) \