objtool: Extract elf_symbol_add()
authorPeter Zijlstra <peterz@infradead.org>
Fri, 26 Mar 2021 15:12:10 +0000 (16:12 +0100)
committerIngo Molnar <mingo@kernel.org>
Fri, 2 Apr 2021 10:45:01 +0000 (12:45 +0200)
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
tools/objtool/elf.c

index c278a04..8457218 100644 (file)
@@ -290,12 +290,39 @@ static int read_sections(struct elf *elf)
        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->node, &sym->sec->symbol_tree, 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)
 {
        struct section *symtab, *symtab_shndx, *sec;
        struct symbol *sym, *pfunc;
-       struct list_head *entry;
-       struct rb_node *pnode;
        int symbols_nr, i;
        char *coldstr;
        Elf_Data *shndx_data = NULL;
@@ -340,9 +367,6 @@ static int read_symbols(struct elf *elf)
                        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 &&
                     sym->sym.st_shndx < SHN_LORESERVE) ||
                    (shndx_data && sym->sym.st_shndx == SHN_XINDEX)) {
@@ -355,32 +379,14 @@ static int read_symbols(struct elf *elf)
                                     sym->name);
                                goto err;
                        }
-                       if (sym->type == STT_SECTION) {
+                       if (GELF_ST_TYPE(sym->sym.st_info) == STT_SECTION) {
                                sym->name = sym->sec->name;
                                sym->sec->sym = sym;
                        }
                } else
                        sym->sec = find_section_by_index(elf, 0);
 
-               sym->offset = sym->sym.st_value;
-               sym->len = sym->sym.st_size;
-
-               rb_add(&sym->node, &sym->sec->symbol_tree, 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);
+               elf_add_symbol(elf, sym);
        }
 
        if (stats)