PR24015, glibc-2.28 on little-endian mips32 broken
authorAlan Modra <amodra@gmail.com>
Thu, 27 Dec 2018 23:11:44 +0000 (09:41 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 28 Dec 2018 04:32:08 +0000 (15:02 +1030)
Commit 2bf2bf23da exposed a bug on targets that create common sections
other than the standard ELF SHN_COMMON.  If these are output by ld -r,
then their type becomes SHT_PROGBITS unless the target handles them
specially (eg. by elf_backend_special_sections), and if they are
merged into .bss/.sbss by ld -r then that section becomes SHT_PROGBITS.

Worse, if they are output by ld -r, then their size is increased by
bfd_generic_define_common_symbol during final link, which leads to
bogus file contents being copied to output.

For mips, it seems to me that the .scommon section should not be
output for ld -r, but I haven't made that change in this patch.

PR 24015
* elf.c (bfd_elf_get_default_section_type): Make common sections
SHT_NOBITS.
* linker.c (bfd_generic_define_common_symbol): Clear
SEC_HAS_CONTENTS.

bfd/ChangeLog
bfd/elf.c
bfd/linker.c

index 8a073f6844e3cb61a3e0c762c88adbb3774ff575..1396c7034e915779e805625fbb7926edea5b35fa 100644 (file)
@@ -1,3 +1,11 @@
+2018-12-28  Alan Modra  <amodra@gmail.com>
+
+       PR 24015
+       * elf.c (bfd_elf_get_default_section_type): Make common sections
+       SHT_NOBITS.
+       * linker.c (bfd_generic_define_common_symbol): Clear
+       SEC_HAS_CONTENTS.
+
 2018-12-28  Alan Modra  <amodra@gmail.com>
 
        PR 23966
index b10dcd83c5506a53c580d6f66dfc61082de19268..d3e391e182810ef8182ff0162d04bd801ea99cb1 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -3127,7 +3127,7 @@ _bfd_elf_init_reloc_shdr (bfd *abfd,
 int
 bfd_elf_get_default_section_type (flagword flags)
 {
-  if ((flags & SEC_ALLOC) != 0
+  if ((flags & (SEC_ALLOC | SEC_IS_COMMON)) != 0
       && (flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
     return SHT_NOBITS;
   return SHT_PROGBITS;
index 9fee90d1010fb50eb1a418b88cec9090448e933b..fff9d9b349eb64f761b8b632cce0798288229c57 100644 (file)
@@ -3119,7 +3119,7 @@ bfd_generic_define_common_symbol (bfd *output_bfd,
   /* Make sure the section is allocated in memory, and make sure that
      it is no longer a common section.  */
   section->flags |= SEC_ALLOC;
-  section->flags &= ~SEC_IS_COMMON;
+  section->flags &= ~(SEC_IS_COMMON | SEC_HAS_CONTENTS);
   return TRUE;
 }