Skip to content
Permalink
Browse files
objtool: Move unsuffixed symbol conversion to a helper function
This logic will also be needed for the CONFIG_CFI_CLANG support.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
  • Loading branch information
jpoimboe authored and intel-lab-lkp committed Jan 15, 2021
1 parent ae9b2b7 commit f06729b24980b0cdff19419510b17f5b493dc756
Showing 1 changed file with 37 additions and 22 deletions.
@@ -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)
{
@@ -463,37 +495,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;

0 comments on commit f06729b

Please sign in to comment.