[binutils-gdb] PR24015, glibc-2.28 on little-endian mips32 broken

Alan Modra amodra@sourceware.org
Fri Dec 28 04:33:00 GMT 2018


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0e41bebb938dbe9eae7063f5321429194bfc5ab7

commit 0e41bebb938dbe9eae7063f5321429194bfc5ab7
Author: Alan Modra <amodra@gmail.com>
Date:   Fri Dec 28 09:41:44 2018 +1030

    PR24015, glibc-2.28 on little-endian mips32 broken
    
    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.

Diff:
---
 bfd/ChangeLog | 8 ++++++++
 bfd/elf.c     | 2 +-
 bfd/linker.c  | 2 +-
 3 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 8a073f6..1396c70 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,13 @@
 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
 	* libbfd.c (SSIZE_MAX): Define.
 	(bfd_malloc, bfd_realloc): Don't cast size to long to check for
diff --git a/bfd/elf.c b/bfd/elf.c
index b10dcd8..d3e391e 100644
--- 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;
diff --git a/bfd/linker.c b/bfd/linker.c
index 9fee90d..fff9d9b 100644
--- a/bfd/linker.c
+++ b/bfd/linker.c
@@ -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;
 }



More information about the Binutils-cvs mailing list