From: Timm Bäder <tbae...@redhat.com> The no_symtab_updates() function was being called at the beginning of all case labels in this switch, so we can just call it once before the switch. Then it only has one call-site, so inline this short function there.
Signed-off-by: Timm Bäder <tbae...@redhat.com> --- src/strip.c | 152 ++++++++++++++++++++++++---------------------------- 1 file changed, 69 insertions(+), 83 deletions(-) diff --git a/src/strip.c b/src/strip.c index e608dc5e..dd1e27ac 100644 --- a/src/strip.c +++ b/src/strip.c @@ -2175,98 +2175,91 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, /* Find all relocation sections which use this symbol table. */ for (cnt = 1; cnt <= shdridx; ++cnt) { - if (shdr_info[cnt].idx == 0 && debug_fname == NULL) + struct shdr_info *info = &shdr_info[cnt]; + if (info->idx == 0 && debug_fname == NULL) /* Ignore sections which are discarded. When we are saving a relocation section in a separate debug file, we must fix up the symbol table references. */ continue; - const Elf32_Word symtabidx = shdr_info[cnt].old_sh_link; + const Elf32_Word symtabidx = info->old_sh_link; elf_assert (symtabidx < shnum + 2); const Elf32_Word *const newsymidx = shdr_info[symtabidx].newsymidx; - switch (shdr_info[cnt].shdr.sh_type) - { - inline bool no_symtab_updates (void) - { - /* If the symbol table hasn't changed, do not do anything. */ - if (shdr_info[symtabidx].newsymidx == NULL) - return true; - - /* If the symbol table is not discarded, but additionally - duplicated in the separate debug file and this section - is discarded, don't adjust anything. */ - return (shdr_info[cnt].idx == 0 - && shdr_info[symtabidx].debug_data != NULL); - } + /* If the symbol table hasn't changed, do not do anything. */ + if (newsymidx == NULL) + continue; + + /* If the symbol table is not discarded, but additionally + duplicated in the separate debug file and this section + is discarded, don't adjust anything. */ + if (info->idx == 0 && shdr_info[symtabidx].debug_data != NULL) + continue; + + switch (info->shdr.sh_type) + { case SHT_REL: case SHT_RELA: - if (no_symtab_updates ()) - break; - - Elf_Data *d = elf_getdata (shdr_info[cnt].idx == 0 - ? elf_getscn (debugelf, cnt) - : elf_getscn (newelf, - shdr_info[cnt].idx), - NULL); - elf_assert (d != NULL && d->d_buf != NULL - && shdr_info[cnt].shdr.sh_entsize != 0); - size_t nrels = (shdr_info[cnt].shdr.sh_size - / shdr_info[cnt].shdr.sh_entsize); - - size_t symsize = gelf_fsize (elf, ELF_T_SYM, 1, EV_CURRENT); - const Elf32_Word symidxn = (shdr_info[symtabidx].data->d_size - / symsize); - if (shdr_info[cnt].shdr.sh_type == SHT_REL) - for (size_t relidx = 0; relidx < nrels; ++relidx) - { - GElf_Rel rel_mem; - if (gelf_getrel (d, relidx, &rel_mem) == NULL) - INTERNAL_ERROR (fname); + { + Elf_Data *d = elf_getdata (info->idx == 0 + ? elf_getscn (debugelf, cnt) + : elf_getscn (newelf, info->idx), + NULL); + elf_assert (d != NULL && d->d_buf != NULL + && info->shdr.sh_entsize != 0); + size_t nrels = (info->shdr.sh_size / info->shdr.sh_entsize); + + size_t symsize = gelf_fsize (elf, ELF_T_SYM, 1, EV_CURRENT); + const Elf32_Word symidxn = (shdr_info[symtabidx].data->d_size + / symsize); + if (info->shdr.sh_type == SHT_REL) + for (size_t relidx = 0; relidx < nrels; ++relidx) + { + GElf_Rel rel_mem; + if (gelf_getrel (d, relidx, &rel_mem) == NULL) + INTERNAL_ERROR (fname); - size_t symidx = GELF_R_SYM (rel_mem.r_info); - elf_assert (symidx < symidxn); - if (newsymidx[symidx] != symidx) - { - rel_mem.r_info - = GELF_R_INFO (newsymidx[symidx], - GELF_R_TYPE (rel_mem.r_info)); + size_t symidx = GELF_R_SYM (rel_mem.r_info); + elf_assert (symidx < symidxn); + if (newsymidx[symidx] != symidx) + { + rel_mem.r_info + = GELF_R_INFO (newsymidx[symidx], + GELF_R_TYPE (rel_mem.r_info)); - if (gelf_update_rel (d, relidx, &rel_mem) == 0) - INTERNAL_ERROR (fname); - } - } - else - for (size_t relidx = 0; relidx < nrels; ++relidx) - { - GElf_Rela rel_mem; - if (gelf_getrela (d, relidx, &rel_mem) == NULL) - INTERNAL_ERROR (fname); + if (gelf_update_rel (d, relidx, &rel_mem) == 0) + INTERNAL_ERROR (fname); + } + } + else + for (size_t relidx = 0; relidx < nrels; ++relidx) + { + GElf_Rela rel_mem; + if (gelf_getrela (d, relidx, &rel_mem) == NULL) + INTERNAL_ERROR (fname); - size_t symidx = GELF_R_SYM (rel_mem.r_info); - elf_assert (symidx < symidxn); - if (newsymidx[symidx] != symidx) - { - rel_mem.r_info - = GELF_R_INFO (newsymidx[symidx], - GELF_R_TYPE (rel_mem.r_info)); + size_t symidx = GELF_R_SYM (rel_mem.r_info); + elf_assert (symidx < symidxn); + if (newsymidx[symidx] != symidx) + { + rel_mem.r_info + = GELF_R_INFO (newsymidx[symidx], + GELF_R_TYPE (rel_mem.r_info)); - if (gelf_update_rela (d, relidx, &rel_mem) == 0) - INTERNAL_ERROR (fname); - } - } + if (gelf_update_rela (d, relidx, &rel_mem) == 0) + INTERNAL_ERROR (fname); + } + } + } break; case SHT_HASH: - if (no_symtab_updates ()) - break; - /* We have to recompute the hash table. */ - elf_assert (shdr_info[cnt].idx > 0); + elf_assert (info->idx > 0); /* The hash section in the new file. */ - scn = elf_getscn (newelf, shdr_info[cnt].idx); + scn = elf_getscn (newelf, info->idx); /* The symbol table data. */ Elf_Data *symd = elf_getdata (elf_getscn (newelf, @@ -2278,7 +2271,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, Elf_Data *hashd = elf_getdata (scn, NULL); elf_assert (hashd != NULL && hashd->d_buf != NULL); - if (shdr_info[cnt].shdr.sh_entsize == sizeof (Elf32_Word)) + if (info->shdr.sh_entsize == sizeof (Elf32_Word)) { /* Sane arches first. */ elf_assert (hashd->d_size >= 2 * sizeof (Elf32_Word)); @@ -2339,8 +2332,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, else { /* Alpha and S390 64-bit use 64-bit SHT_HASH entries. */ - elf_assert (shdr_info[cnt].shdr.sh_entsize - == sizeof (Elf64_Xword)); + elf_assert (info->shdr.sh_entsize == sizeof (Elf64_Xword)); Elf64_Xword *bucket = (Elf64_Xword *) hashd->d_buf; @@ -2402,13 +2394,10 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, case SHT_GNU_versym: /* If the symbol table changed we have to adjust the entries. */ - if (no_symtab_updates ()) - break; - - elf_assert (shdr_info[cnt].idx > 0); + elf_assert (info->idx > 0); /* The symbol version section in the new file. */ - scn = elf_getscn (newelf, shdr_info[cnt].idx); + scn = elf_getscn (newelf, info->idx); /* The symbol table data. */ symd = elf_getdata (elf_getscn (newelf, shdr_info[symtabidx].idx), @@ -2444,12 +2433,9 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, break; case SHT_GROUP: - if (no_symtab_updates ()) - break; - /* Yes, the symbol table changed. Update the section header of the section group. */ - scn = elf_getscn (newelf, shdr_info[cnt].idx); + scn = elf_getscn (newelf, info->idx); GElf_Shdr shdr_mem; GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); elf_assert (shdr != NULL); -- 2.26.2