[binutils-gdb] elf: Remove zero-sized relocation section from section group

H.J. Lu hjl@sourceware.org
Sat Apr 4 02:09:22 GMT 2020


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

commit 3349112e380712432d5818154d67ab4660af056f
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Fri Apr 3 19:06:29 2020 -0700

    elf: Remove zero-sized relocation section from section group
    
    Remove zero-sized relocation section from a section group since it has
    been removed from the output.
    
            PR ld/25767
            * elf.c (_bfd_elf_fixup_group_sections): Remove zero-sized
            relocation section from section group.

Diff:
---
 bfd/ChangeLog |  6 ++++++
 bfd/elf.c     | 37 ++++++++++++++++++++++++++-----------
 2 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 64c3dde4754..57cf0f139c9 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2020-04-03  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/25767
+	* elf.c (_bfd_elf_fixup_group_sections): Remove zero-sized
+	relocation section from section group.
+
 2020-04-02  Jan W. Jagersma  <jwjagersma@gmail.com>
 
 	* bfdio.c (bfd_bread, bfd_tell, bfd_seek, bfd_mmap): Always add
diff --git a/bfd/elf.c b/bfd/elf.c
index 86dadea05ca..1780074f5ab 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -7929,19 +7929,34 @@ _bfd_elf_fixup_group_sections (bfd *ibfd, asection *discarded)
 		elf_section_flags (s->output_section) &= ~SHF_GROUP;
 		elf_group_name (s->output_section) = NULL;
 	      }
-	    /* Conversely, if the member section is not being output
-	       but the SHT_GROUP section is, then adjust its size.  */
-	    else if (s->output_section == discarded
-		     && isec->output_section != discarded)
+	    else
 	      {
 		struct bfd_elf_section_data *elf_sec = elf_section_data (s);
-		removed += 4;
-		if (elf_sec->rel.hdr != NULL
-		    && (elf_sec->rel.hdr->sh_flags & SHF_GROUP) != 0)
-		  removed += 4;
-		if (elf_sec->rela.hdr != NULL
-		    && (elf_sec->rela.hdr->sh_flags & SHF_GROUP) != 0)
-		  removed += 4;
+		if (s->output_section == discarded
+		    && isec->output_section != discarded)
+		  {
+		    /* Conversely, if the member section is not being
+		       output but the SHT_GROUP section is, then adjust
+		       its size.  */
+		    removed += 4;
+		    if (elf_sec->rel.hdr != NULL
+			&& (elf_sec->rel.hdr->sh_flags & SHF_GROUP) != 0)
+		      removed += 4;
+		    if (elf_sec->rela.hdr != NULL
+			&& (elf_sec->rela.hdr->sh_flags & SHF_GROUP) != 0)
+		      removed += 4;
+		  }
+		else
+		  {
+		    /* Also adjust for zero-sized relocation member
+		       section.  */
+		    if (elf_sec->rel.hdr != NULL
+			&& elf_sec->rel.hdr->sh_size == 0)
+		      removed += 4;
+		    if (elf_sec->rela.hdr != NULL
+			&& elf_sec->rela.hdr->sh_size == 0)
+		      removed += 4;
+		  }
 	      }
 	    s = elf_next_in_group (s);
 	    if (s == first)


More information about the Binutils-cvs mailing list