PR23850, strip should not discard/move .rela.plt in executable
authorAlan Modra <amodra@gmail.com>
Fri, 2 Nov 2018 01:17:07 +0000 (11:47 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 2 Nov 2018 03:18:08 +0000 (13:48 +1030)
strip/objcopy can't deal with alloc reloc sections, not .rela.dyn or
.rela.plt in a dynamic executable, or .rela.plt/.rela.iplt in a static
executable.  So, don't have BFD treat them as side-channel data
associated with the section they are relocating.

PR 23850
* elf.c (bfd_section_from_shdr): Treat SHF_ALLOC SHT_REL* sections
in an executable or shared library as normal sections.

bfd/ChangeLog
bfd/elf.c

index 383ad4414c657b537f83fe63c39d980ee5546d5f..d8b50f538178e18f68aa24d171b39d5c2604e743 100644 (file)
@@ -1,3 +1,9 @@
+2018-11-02  Alan Modra  <amodra@gmail.com>
+
+       PR 23850
+       * elf.c (bfd_section_from_shdr): Treat SHF_ALLOC SHT_REL* sections
+       in an executable or shared library as normal sections.
+
 2018-10-31  Renlin Li  <renlin.li@arm.com>
 
        * elfnn-aarch64.c (elfNN_aarch64_check_relocs): Don't create got
index 764c61f04458a790ff2cc85440964ae7c5eabe6d..bebda20195f84ebda3c16189b5df0276e1dd9789 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -2384,15 +2384,18 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
            && ! bfd_section_from_shdr (abfd, hdr->sh_link))
          goto fail;
 
-       /* If this reloc section does not use the main symbol table we
-          don't treat it as a reloc section.  BFD can't adequately
-          represent such a section, so at least for now, we don't
-          try.  We just present it as a normal section.  We also
-          can't use it as a reloc section if it points to the null
-          section, an invalid section, another reloc section, or its
-          sh_link points to the null section.  */
-       if (hdr->sh_link != elf_onesymtab (abfd)
+       /* If this is an alloc section in an executable or shared
+          library, or the reloc section does not use the main symbol
+          table we don't treat it as a reloc section.  BFD can't
+          adequately represent such a section, so at least for now,
+          we don't try.  We just present it as a normal section.  We
+          also can't use it as a reloc section if it points to the
+          null section, an invalid section, another reloc section, or
+          its sh_link points to the null section.  */
+       if (((abfd->flags & (DYNAMIC | EXEC_P)) != 0
+            && (hdr->sh_flags & SHF_ALLOC) != 0)
            || hdr->sh_link == SHN_UNDEF
+           || hdr->sh_link != elf_onesymtab (abfd)
            || hdr->sh_info == SHN_UNDEF
            || hdr->sh_info >= num_sec
            || elf_elfsections (abfd)[hdr->sh_info]->sh_type == SHT_REL