On Thu, Jan 14, 2021 at 9:55 PM Josh Poimboeuf <jpoim...@redhat.com> wrote: > > This logic will also be needed for the CONFIG_CFI_CLANG support. >
Good you fixed that in v2. I re-pulled from [1]. - Sedat - [1] https://git.kernel.org/pub/scm/linux/kernel/git/jpoimboe/linux.git/log/?h=objtool-vmlinux > Signed-off-by: Josh Poimboeuf <jpoim...@redhat.com> > --- > tools/objtool/elf.c | 60 ++++++++++++++++++++++++++++----------------- > 1 file changed, 37 insertions(+), 23 deletions(-) > > diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c > index be89c741ba9a..6d248a19e2c6 100644 > --- a/tools/objtool/elf.c > +++ b/tools/objtool/elf.c > @@ -262,6 +262,38 @@ struct reloc *find_reloc_by_dest(const struct elf *elf, > struct section *sec, uns > return find_reloc_by_dest_range(elf, sec, offset, 1); > } > > +static int find_unsuffixed_func(const struct elf *elf, struct symbol *sym, > + const char *suffix, struct symbol **func) > +{ > + char name[MAX_NAME_LEN + 1]; > + const char *loc; > + size_t len; > + > + *func = NULL; > + > + loc = strstr(sym->name, suffix); > + if (!loc) > + return 0; > + > + len = loc - sym->name; > + if (len > MAX_NAME_LEN) { > + WARN("%s(): unsuffixed function name exceeds maximum length > of %d characters", > + sym->name, MAX_NAME_LEN); > + return -1; > + } > + > + strncpy(name, sym->name, len); > + name[len] = '\0'; > + > + *func = find_symbol_by_name(elf, name); > + if (!*func || (*func)->type != STT_FUNC) { > + WARN("%s(): can't find unsuffixed function", sym->name); > + return -1; > + } > + > + return 0; > +} > + > void insn_to_reloc_sym_addend(struct section *sec, unsigned long offset, > struct reloc *reloc) > { > @@ -374,7 +406,6 @@ static int read_symbols(struct elf *elf) > struct list_head *entry; > struct rb_node *pnode; > int symbols_nr, i; > - char *coldstr; > Elf_Data *shndx_data = NULL; > Elf32_Word shndx; > > @@ -456,37 +487,20 @@ static int read_symbols(struct elf *elf) > /* Create parent/child links for any cold subfunctions */ > list_for_each_entry(sec, &elf->sections, list) { > list_for_each_entry(sym, &sec->symbol_list, list) { > - char pname[MAX_NAME_LEN + 1]; > - size_t pnamelen; > if (sym->type != STT_FUNC) > continue; > > - if (sym->pfunc == NULL) > + if (!sym->pfunc) > sym->pfunc = sym; > > - if (sym->cfunc == NULL) > + if (!sym->cfunc) > sym->cfunc = sym; > > - coldstr = strstr(sym->name, ".cold"); > - if (!coldstr) > - continue; > - > - pnamelen = coldstr - sym->name; > - if (pnamelen > MAX_NAME_LEN) { > - WARN("%s(): parent function name exceeds > maximum length of %d characters", > - sym->name, MAX_NAME_LEN); > + if (find_unsuffixed_func(elf, sym, ".cold", &pfunc)) > return -1; > - } > > - strncpy(pname, sym->name, pnamelen); > - pname[pnamelen] = '\0'; > - pfunc = find_symbol_by_name(elf, pname); > - > - if (!pfunc) { > - WARN("%s(): can't find parent function", > - sym->name); > - return -1; > - } > + if (!pfunc) > + continue; > > sym->pfunc = pfunc; > pfunc->cfunc = sym; > -- > 2.29.2 >