aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2018-11-02 11:47:07 +1030
committerAlan Modra <amodra@gmail.com>2018-11-02 13:48:08 +1030
commita4bcd733712abd892aa7fe0d79a3f999b461f119 (patch)
tree3965b6a819e9886a5906e0971bf6bf268c41dfea
parent3ba2ee38a648b7f52e77700325b26137f6332fe2 (diff)
downloadbinutils-a4bcd733712abd892aa7fe0d79a3f999b461f119.zip
binutils-a4bcd733712abd892aa7fe0d79a3f999b461f119.tar.gz
binutils-a4bcd733712abd892aa7fe0d79a3f999b461f119.tar.bz2
PR23850, strip should not discard/move .rela.plt in executable
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.
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf.c19
2 files changed, 17 insertions, 8 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 383ad44..d8b50f5 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elf.c b/bfd/elf.c
index 764c61f..bebda20 100644
--- 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