This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb/binutils-2_30-branch] PR22836, "-r -s" doesn't work with -g3 using GCC 7


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

commit d957f81cb38d7e82ae546cd03265ee3087ba8a85
Author: Alan Modra <amodra@gmail.com>
Date:   Tue Feb 13 14:09:48 2018 +1030

    PR22836, "-r -s" doesn't work with -g3 using GCC 7
    
    This fixes the case where all of a group is removed with ld -r, the
    situation in the PR, and failures where part of a group is removed
    that contain relocs.
    
    bfd/
    	PR 22836
    	* elf.c (_bfd_elf_fixup_group_sections): Account for removed
    	relocation sections.  If size reduces to just the flag word,
    	remove that too and mark with SEC_EXCLUDE.
    	* elflink.c (bfd_elf_final_link): Strip empty group sections.
    binutils/
    	* testsuite/binutils-all/group-7.s,
    	* testsuite/binutils-all/group-7a.d,
    	* testsuite/binutils-all/group-7b.d,
    	* testsuite/binutils-all/group-7c.d: New tests.
    	* testsuite/binutils-all/objcopy.exp: Run them.
    ld/
    	* testsuite/ld-elf/pr22836-2.d,
    	* testsuite/ld-elf/pr22836-2.s: New test.
    
    (cherry picked from commit 6e5e9d58c1eeef5677c90886578a895cb8c164c5)

Diff:
---
 bfd/ChangeLog                               | 11 +++++++++++
 bfd/elf.c                                   | 25 +++++++++++++++++++++----
 bfd/elflink.c                               |  7 +++++++
 binutils/ChangeLog                          | 12 ++++++++++++
 binutils/testsuite/binutils-all/group-7.s   |  6 ++++++
 binutils/testsuite/binutils-all/group-7a.d  | 16 ++++++++++++++++
 binutils/testsuite/binutils-all/group-7b.d  | 19 +++++++++++++++++++
 binutils/testsuite/binutils-all/group-7c.d  |  8 ++++++++
 binutils/testsuite/binutils-all/objcopy.exp |  3 +++
 ld/ChangeLog                                |  9 +++++++++
 ld/testsuite/ld-elf/pr22836-2.d             |  7 +++++++
 ld/testsuite/ld-elf/pr22836-2.s             |  7 +++++++
 12 files changed, 126 insertions(+), 4 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 6d1a967..13ccbc5 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,14 @@
+2018-03-19  H.J. Lu  <hongjiu.lu@intel.com>
+
+	Backport from master branch
+	2018-02-13  Alan Modra  <amodra@gmail.com>
+
+	PR 22836
+	* elf.c (_bfd_elf_fixup_group_sections): Account for removed
+	relocation sections.  If size reduces to just the flag word,
+	remove that too and mark with SEC_EXCLUDE.
+	* elflink.c (bfd_elf_final_link): Strip empty group sections.
+
 2018-03-14  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR ld/20882
diff --git a/bfd/elf.c b/bfd/elf.c
index 325bdd5..e95c8a9 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -7579,7 +7579,16 @@ _bfd_elf_fixup_group_sections (bfd *ibfd, asection *discarded)
 	       but the SHT_GROUP section is, then adjust its size.  */
 	    else if (s->output_section == discarded
 		     && isec->output_section != discarded)
-	      removed += 4;
+	      {
+		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;
+	      }
 	    s = elf_next_in_group (s);
 	    if (s == first)
 	      break;
@@ -7589,18 +7598,26 @@ _bfd_elf_fixup_group_sections (bfd *ibfd, asection *discarded)
 	    if (discarded != NULL)
 	      {
 		/* If we've been called for ld -r, then we need to
-		   adjust the input section size.  This function may
-		   be called multiple times, so save the original
-		   size.  */
+		   adjust the input section size.  */
 		if (isec->rawsize == 0)
 		  isec->rawsize = isec->size;
 		isec->size = isec->rawsize - removed;
+		if (isec->size <= 4)
+		  {
+		    isec->size = 0;
+		    isec->flags |= SEC_EXCLUDE;
+		  }
 	      }
 	    else
 	      {
 		/* Adjust the output section size when called from
 		   objcopy. */
 		isec->output_section->size -= removed;
+		if (isec->output_section->size <= 4)
+		  {
+		    isec->output_section->size = 0;
+		    isec->output_section->flags |= SEC_EXCLUDE;
+		  }
 	      }
 	  }
       }
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 72aa3ac..69cb5ab 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -11618,6 +11618,13 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
 	  else
 	    o->flags |= SEC_EXCLUDE;
 	}
+      else if ((o->flags & SEC_GROUP) != 0 && o->size == 0)
+	{
+	  /* Remove empty group section from linker output.  */
+	  o->flags |= SEC_EXCLUDE;
+	  bfd_section_list_remove (abfd, o);
+	  abfd->section_count--;
+	}
     }
 
   /* Count up the number of relocations we will output for each output
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 674b9f9..0eba844 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,15 @@
+2018-03-19  H.J. Lu  <hongjiu.lu@intel.com>
+
+	Backport from master branch
+	2018-02-13  Alan Modra  <amodra@gmail.com>
+
+	PR 22836
+	* testsuite/binutils-all/group-7.s,
+	* testsuite/binutils-all/group-7a.d,
+	* testsuite/binutils-all/group-7b.d,
+	* testsuite/binutils-all/group-7c.d: New tests.
+	* testsuite/binutils-all/objcopy.exp: Run them.
+
 2018-02-27  Nick Clifton  <nickc@redhat.com>
 
 	* po/pt.po: New Portuguese translation.
diff --git a/binutils/testsuite/binutils-all/group-7.s b/binutils/testsuite/binutils-all/group-7.s
new file mode 100644
index 0000000..5028afc
--- /dev/null
+++ b/binutils/testsuite/binutils-all/group-7.s
@@ -0,0 +1,6 @@
+	.section        .data.foo,"awG",%progbits,foo,comdat
+here:
+	.dc.a	here
+
+	.section        .data2.foo,"awG",%progbits,foo,comdat
+	.dc.a	0
diff --git a/binutils/testsuite/binutils-all/group-7a.d b/binutils/testsuite/binutils-all/group-7a.d
new file mode 100644
index 0000000..fa8db60
--- /dev/null
+++ b/binutils/testsuite/binutils-all/group-7a.d
@@ -0,0 +1,16 @@
+#name: copy removing reloc group member
+#source: group-7.s
+#PROG: objcopy
+#DUMPPROG: readelf
+#objcopy: --remove-section .data.foo
+#readelf: -Sg --wide
+
+#...
+  \[[ 0-9]+\] \.group[ \t]+GROUP[ \t]+.*
+#...
+  \[[ 0-9]+\] \.data2\.foo[ \t]+PROGBITS[ \t0-9a-f]+WAG.*
+#...
+COMDAT group section \[[ 0-9]+\] `\.group' \[foo\] contains 1 section.*
+   \[Index\]    Name
+   \[[ 0-9]+\]   \.data2\.foo
+#pass
diff --git a/binutils/testsuite/binutils-all/group-7b.d b/binutils/testsuite/binutils-all/group-7b.d
new file mode 100644
index 0000000..b674545
--- /dev/null
+++ b/binutils/testsuite/binutils-all/group-7b.d
@@ -0,0 +1,19 @@
+#name: copy removing non-reloc group member
+#source: group-7.s
+#PROG: objcopy
+#DUMPPROG: readelf
+#objcopy: --remove-section .data2.foo
+#readelf: -Sg --wide
+
+#...
+  \[[ 0-9]+\] \.group[ \t]+GROUP[ \t]+.*
+#...
+  \[[ 0-9]+\] \.data\.foo[ \t]+PROGBITS[ \t0-9a-f]+WAG.*
+#...
+  \[[ 0-9]+\] \.rela?\.data\.foo[ \t]+RELA?[ \t0-9a-f]+IG.*
+#...
+COMDAT group section \[[ 0-9]+\] `\.group' \[foo\] contains 2 sections:
+   \[Index\]    Name
+   \[[ 0-9]+\]   \.data\.foo
+   \[[ 0-9]+\]   \.rela?\.data\.foo
+#pass
diff --git a/binutils/testsuite/binutils-all/group-7c.d b/binutils/testsuite/binutils-all/group-7c.d
new file mode 100644
index 0000000..83e9115
--- /dev/null
+++ b/binutils/testsuite/binutils-all/group-7c.d
@@ -0,0 +1,8 @@
+#name: copy removing reloc and non-reloc group member
+#source: group-7.s
+#PROG: objcopy
+#DUMPPROG: readelf
+#objcopy: -R .data.foo -R .data2.foo
+#readelf: -g --wide
+
+There are no section groups in this file\.
diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp
index 377f88c..f4a7692 100644
--- a/binutils/testsuite/binutils-all/objcopy.exp
+++ b/binutils/testsuite/binutils-all/objcopy.exp
@@ -1051,6 +1051,9 @@ if [is_elf_format] {
     objcopy_test_readelf "GNU_MBIND section" mbind1.s
     run_dump_test "group-5"
     run_dump_test "group-6"
+    run_dump_test "group-7a"
+    run_dump_test "group-7b"
+    run_dump_test "group-7c"
     run_dump_test "copy-1"
     run_dump_test "note-1"
     if [is_elf64 tmpdir/bintest.o] {
diff --git a/ld/ChangeLog b/ld/ChangeLog
index b5cf58a..f47f7c8 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,12 @@
+2018-03-19  H.J. Lu  <hongjiu.lu@intel.com>
+
+	Backport from master branch
+	2018-02-13  Alan Modra  <amodra@gmail.com>
+
+	PR 22836
+	* testsuite/ld-elf/pr22836-2.d,
+	* testsuite/ld-elf/pr22836-2.s: New test.
+
 2018-03-14  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR ld/20882
diff --git a/ld/testsuite/ld-elf/pr22836-2.d b/ld/testsuite/ld-elf/pr22836-2.d
new file mode 100644
index 0000000..10133e4
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr22836-2.d
@@ -0,0 +1,7 @@
+#source: pr22836-2.s
+#ld: -r -S
+#readelf: -g --wide
+
+group section \[[ 0-9]+\] `\.group' \[foo\] contains 1 section.*
+   \[Index\]    Name
+   \[[ 0-9]+\]   \.comment
diff --git a/ld/testsuite/ld-elf/pr22836-2.s b/ld/testsuite/ld-elf/pr22836-2.s
new file mode 100644
index 0000000..77cd83a
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr22836-2.s
@@ -0,0 +1,7 @@
+	.section	.debug_macro,"G",%progbits,foo
+	.long	.LASF0
+.LASF0:
+	.string	"__STDC__ 1"
+
+	.section	.comment,"G",%progbits,foo
+	.asciz "hi"


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]