mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 14:42:24 +00:00
objtool: Handle function aliases
Function aliases result in different symbols for the same set of instructions; track a canonical symbol so there is a unique point of access. This again prepares the way for function attributes. And in particular the need for aliases comes from how KASAN uses them. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
a4d09dde90
commit
09f30d83d3
@ -219,7 +219,7 @@ static int read_sections(struct elf *elf)
|
|||||||
static int read_symbols(struct elf *elf)
|
static int read_symbols(struct elf *elf)
|
||||||
{
|
{
|
||||||
struct section *symtab, *sec;
|
struct section *symtab, *sec;
|
||||||
struct symbol *sym, *pfunc;
|
struct symbol *sym, *pfunc, *alias;
|
||||||
struct list_head *entry, *tmp;
|
struct list_head *entry, *tmp;
|
||||||
int symbols_nr, i;
|
int symbols_nr, i;
|
||||||
char *coldstr;
|
char *coldstr;
|
||||||
@ -239,6 +239,7 @@ static int read_symbols(struct elf *elf)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memset(sym, 0, sizeof(*sym));
|
memset(sym, 0, sizeof(*sym));
|
||||||
|
alias = sym;
|
||||||
|
|
||||||
sym->idx = i;
|
sym->idx = i;
|
||||||
|
|
||||||
@ -288,11 +289,17 @@ static int read_symbols(struct elf *elf)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sym->offset == s->offset && sym->len >= s->len) {
|
if (sym->offset == s->offset) {
|
||||||
entry = tmp;
|
if (sym->len == s->len && alias == sym)
|
||||||
break;
|
alias = s;
|
||||||
|
|
||||||
|
if (sym->len >= s->len) {
|
||||||
|
entry = tmp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
sym->alias = alias;
|
||||||
list_add(&sym->list, entry);
|
list_add(&sym->list, entry);
|
||||||
hash_add(sym->sec->symbol_hash, &sym->hash, sym->idx);
|
hash_add(sym->sec->symbol_hash, &sym->hash, sym->idx);
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ struct symbol {
|
|||||||
unsigned char bind, type;
|
unsigned char bind, type;
|
||||||
unsigned long offset;
|
unsigned long offset;
|
||||||
unsigned int len;
|
unsigned int len;
|
||||||
struct symbol *pfunc, *cfunc;
|
struct symbol *pfunc, *cfunc, *alias;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rela {
|
struct rela {
|
||||||
|
Loading…
Reference in New Issue
Block a user