diff options
Diffstat (limited to 'src/strip.c')
| -rw-r--r-- | src/strip.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/src/strip.c b/src/strip.c index da093e97..819b67e8 100644 --- a/src/strip.c +++ b/src/strip.c @@ -1341,15 +1341,12 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, /* Get the full section index, if necessary from the XINDEX table. */ - if (sym->st_shndx != SHN_XINDEX) - sec = shdr_info[sym->st_shndx].idx; - else - { - elf_assert (shndxdata != NULL - && shndxdata->d_buf != NULL); - - sec = shdr_info[xshndx].idx; - } + if (sym->st_shndx == SHN_XINDEX) + elf_assert (shndxdata != NULL + && shndxdata->d_buf != NULL); + size_t sidx = (sym->st_shndx != SHN_XINDEX + ? sym->st_shndx : xshndx); + sec = shdr_info[sidx].idx; if (sec != 0) { @@ -1387,6 +1384,24 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, shdr_info[cnt].shdr.sh_info = destidx - 1; } } + else if ((shdr_info[cnt].shdr.sh_flags & SHF_ALLOC) != 0 + && GELF_ST_TYPE (sym->st_info) != STT_SECTION + && shdr_info[sidx].shdr.sh_type != SHT_GROUP) + { + /* Removing a real symbol from an allocated + symbol table is hard and probably a + mistake. Really removing it means + rewriting the dynamic segment and hash + sections. Just warn and set the symbol + section to UNDEF. */ + error (0, 0, + gettext ("Cannot remove symbol [%zd] from allocated symbol table [%zd]"), inner, cnt); + sym->st_shndx = SHN_UNDEF; + if (gelf_update_sym (shdr_info[cnt].data, destidx, + sym) == 0) + INTERNAL_ERROR (fname); + shdr_info[cnt].newsymidx[inner] = destidx++; + } else if (debug_fname != NULL && shdr_info[cnt].debug_data == NULL) /* The symbol points to a section that is discarded @@ -1394,8 +1409,6 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname, this is a section or group signature symbol for a section which has been removed. */ { - size_t sidx = (sym->st_shndx != SHN_XINDEX - ? sym->st_shndx : xshndx); elf_assert (GELF_ST_TYPE (sym->st_info) == STT_SECTION || ((shdr_info[sidx].shdr.sh_type == SHT_GROUP) |
