objtool: Extract elf_symbol_add()
commit 9a7827b7789c630c1efdb121daa42c6e77dce97f upstream. Create a common helper to add symbols. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Borislav Petkov <bp@suse.de> Signed-off-by: Ingo Molnar <mingo@kernel.org> Reviewed-by: Miroslav Benes <mbenes@suse.cz> Link: https://lkml.kernel.org/r/20210326151300.003468981@infradead.org [bwh: Backported to 5.10: rb_add() parameter order is different] Signed-off-by: Ben Hutchings <ben@decadent.org.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
da962cd0a2
commit
b69e1b4b68
@@ -341,12 +341,39 @@ static int read_sections(struct elf *elf)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void elf_add_symbol(struct elf *elf, struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct list_head *entry;
|
||||||
|
struct rb_node *pnode;
|
||||||
|
|
||||||
|
sym->type = GELF_ST_TYPE(sym->sym.st_info);
|
||||||
|
sym->bind = GELF_ST_BIND(sym->sym.st_info);
|
||||||
|
|
||||||
|
sym->offset = sym->sym.st_value;
|
||||||
|
sym->len = sym->sym.st_size;
|
||||||
|
|
||||||
|
rb_add(&sym->sec->symbol_tree, &sym->node, symbol_to_offset);
|
||||||
|
pnode = rb_prev(&sym->node);
|
||||||
|
if (pnode)
|
||||||
|
entry = &rb_entry(pnode, struct symbol, node)->list;
|
||||||
|
else
|
||||||
|
entry = &sym->sec->symbol_list;
|
||||||
|
list_add(&sym->list, entry);
|
||||||
|
elf_hash_add(elf->symbol_hash, &sym->hash, sym->idx);
|
||||||
|
elf_hash_add(elf->symbol_name_hash, &sym->name_hash, str_hash(sym->name));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Don't store empty STT_NOTYPE symbols in the rbtree. They
|
||||||
|
* can exist within a function, confusing the sorting.
|
||||||
|
*/
|
||||||
|
if (!sym->len)
|
||||||
|
rb_erase(&sym->node, &sym->sec->symbol_tree);
|
||||||
|
}
|
||||||
|
|
||||||
static int read_symbols(struct elf *elf)
|
static int read_symbols(struct elf *elf)
|
||||||
{
|
{
|
||||||
struct section *symtab, *symtab_shndx, *sec;
|
struct section *symtab, *symtab_shndx, *sec;
|
||||||
struct symbol *sym, *pfunc;
|
struct symbol *sym, *pfunc;
|
||||||
struct list_head *entry;
|
|
||||||
struct rb_node *pnode;
|
|
||||||
int symbols_nr, i;
|
int symbols_nr, i;
|
||||||
char *coldstr;
|
char *coldstr;
|
||||||
Elf_Data *shndx_data = NULL;
|
Elf_Data *shndx_data = NULL;
|
||||||
@@ -391,9 +418,6 @@ static int read_symbols(struct elf *elf)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
sym->type = GELF_ST_TYPE(sym->sym.st_info);
|
|
||||||
sym->bind = GELF_ST_BIND(sym->sym.st_info);
|
|
||||||
|
|
||||||
if ((sym->sym.st_shndx > SHN_UNDEF &&
|
if ((sym->sym.st_shndx > SHN_UNDEF &&
|
||||||
sym->sym.st_shndx < SHN_LORESERVE) ||
|
sym->sym.st_shndx < SHN_LORESERVE) ||
|
||||||
(shndx_data && sym->sym.st_shndx == SHN_XINDEX)) {
|
(shndx_data && sym->sym.st_shndx == SHN_XINDEX)) {
|
||||||
@@ -406,32 +430,14 @@ static int read_symbols(struct elf *elf)
|
|||||||
sym->name);
|
sym->name);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (sym->type == STT_SECTION) {
|
if (GELF_ST_TYPE(sym->sym.st_info) == STT_SECTION) {
|
||||||
sym->name = sym->sec->name;
|
sym->name = sym->sec->name;
|
||||||
sym->sec->sym = sym;
|
sym->sec->sym = sym;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
sym->sec = find_section_by_index(elf, 0);
|
sym->sec = find_section_by_index(elf, 0);
|
||||||
|
|
||||||
sym->offset = sym->sym.st_value;
|
elf_add_symbol(elf, sym);
|
||||||
sym->len = sym->sym.st_size;
|
|
||||||
|
|
||||||
rb_add(&sym->sec->symbol_tree, &sym->node, symbol_to_offset);
|
|
||||||
pnode = rb_prev(&sym->node);
|
|
||||||
if (pnode)
|
|
||||||
entry = &rb_entry(pnode, struct symbol, node)->list;
|
|
||||||
else
|
|
||||||
entry = &sym->sec->symbol_list;
|
|
||||||
list_add(&sym->list, entry);
|
|
||||||
elf_hash_add(elf->symbol_hash, &sym->hash, sym->idx);
|
|
||||||
elf_hash_add(elf->symbol_name_hash, &sym->name_hash, str_hash(sym->name));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Don't store empty STT_NOTYPE symbols in the rbtree. They
|
|
||||||
* can exist within a function, confusing the sorting.
|
|
||||||
*/
|
|
||||||
if (!sym->len)
|
|
||||||
rb_erase(&sym->node, &sym->sec->symbol_tree);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stats)
|
if (stats)
|
||||||
|
Reference in New Issue
Block a user