find_symbol_by_name() only returns the first match, so --debug-checksum=<func> silently ignores any subsequent duplicately named functions after the first.
Add a new iterate_sym_by_name() to fix that. Signed-off-by: Josh Poimboeuf <[email protected]> --- tools/objtool/check.c | 19 ++++++++++++++----- tools/objtool/elf.c | 12 ++++++++++++ tools/objtool/include/objtool/elf.h | 3 +++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 5722d4568401..f14212a8c179 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -3657,6 +3657,17 @@ static bool skip_alt_group(struct instruction *insn) return alt_insn->type == INSN_CLAC || alt_insn->type == INSN_STAC; } +static void enable_debug_checksum_cb(struct symbol *sym, void *d) +{ + bool *found = d; + + if (!is_func_sym(sym)) + return; + + sym->debug_checksum = 1; + *found = true; +} + static int checksum_debug_init(struct objtool_file *file) { char *dup, *s; @@ -3672,18 +3683,16 @@ static int checksum_debug_init(struct objtool_file *file) s = dup; while (*s) { - struct symbol *func; + bool found = false; char *comma; comma = strchr(s, ','); if (comma) *comma = '\0'; - func = find_symbol_by_name(file->elf, s); - if (!func || !is_func_sym(func)) + iterate_sym_by_name(file->elf, s, enable_debug_checksum_cb, &found); + if (!found) WARN("--debug-checksum: can't find '%s'", s); - else - func->debug_checksum = 1; if (!comma) break; diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c index ac9da81a7a2f..a5486e172e5c 100644 --- a/tools/objtool/elf.c +++ b/tools/objtool/elf.c @@ -335,6 +335,18 @@ void iterate_global_symbol_by_demangled_name(const struct elf *elf, } } +void iterate_sym_by_name(const struct elf *elf, const char *name, + void (*process)(struct symbol *sym, void *data), + void *data) +{ + struct symbol *sym; + + elf_hash_for_each_possible(symbol_name, sym, name_hash, str_hash_demangled(name)) { + if (!strcmp(sym->name, name)) + process(sym, data); + } +} + struct reloc *find_reloc_by_dest_range(const struct elf *elf, struct section *sec, unsigned long offset, unsigned int len) { diff --git a/tools/objtool/include/objtool/elf.h b/tools/objtool/include/objtool/elf.h index c61bd57767f9..cd5844c7b4e2 100644 --- a/tools/objtool/include/objtool/elf.h +++ b/tools/objtool/include/objtool/elf.h @@ -189,6 +189,9 @@ struct symbol *find_global_symbol_by_name(const struct elf *elf, const char *nam void iterate_global_symbol_by_demangled_name(const struct elf *elf, const char *demangled_name, void (*process)(struct symbol *sym, void *data), void *data); +void iterate_sym_by_name(const struct elf *elf, const char *name, + void (*process)(struct symbol *sym, void *data), + void *data); struct symbol *find_symbol_containing(const struct section *sec, unsigned long offset); int find_symbol_hole_containing(const struct section *sec, unsigned long offset); struct reloc *find_reloc_by_dest(const struct elf *elf, struct section *sec, unsigned long offset); -- 2.53.0

