This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH] Remove the stripped group section from linker output
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Nick Clifton <nickc at redhat dot com>
- Cc: Alan Modra <amodra at gmail dot com>, Richard Guenther <rguenther at suse dot de>, Binutils <binutils at sourceware dot org>
- Date: Mon, 19 Mar 2018 08:10:36 -0700
- Subject: Re: [PATCH] Remove the stripped group section from linker output
- References: <20180212181340.GA22522@gmail.com> <20180213020152.GC30218@bubble.grove.modra.org> <CAMe9rOowjWt4gLz2=jjEbS=1muwQZ47MoLi2tegdELDcrkYTVw@mail.gmail.com> <20180213074234.GD30218@bubble.grove.modra.org> <20180213095827.GF30218@bubble.grove.modra.org> <20180213122940.GG30218@bubble.grove.modra.org> <20180214015047.GH30218@bubble.grove.modra.org> <CAMe9rOrWGjCW=fqxsatouEiT4ypgV9G-n7y2MqnyhN+Po4pjPQ@mail.gmail.com> <50a4158e-44b5-2865-4d41-a42f8fe88862@redhat.com>
On Mon, Mar 19, 2018 at 6:48 AM, Nick Clifton <nickc@redhat.com> wrote:
> Hi H.J.
>
>> There is a request to backport the fix to 2.30 branch.
> This is OK with me.
>
This are what I checked into 2.30 branch.
Thanks.
--
H.J.
From d957f81cb38d7e82ae546cd03265ee3087ba8a85 Mon Sep 17 00:00:00 2001
From: Alan Modra <amodra@gmail.com>
Date: Tue, 13 Feb 2018 14:09:48 +1030
Subject: [PATCH 1/2] 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)
---
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(-)
create mode 100644 binutils/testsuite/binutils-all/group-7.s
create mode 100644 binutils/testsuite/binutils-all/group-7a.d
create mode 100644 binutils/testsuite/binutils-all/group-7b.d
create mode 100644 binutils/testsuite/binutils-all/group-7c.d
create mode 100644 ld/testsuite/ld-elf/pr22836-2.d
create mode 100644 ld/testsuite/ld-elf/pr22836-2.s
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 6d1a9678a4..13ccbc5eb0 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 325bdd545a..e95c8a9c83 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 72aa3ac9c2..69cb5abbac 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 674b9f9d88..0eba8440e8 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 0000000000..5028afc1f5
--- /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 0000000000..fa8db60d9e
--- /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 0000000000..b674545362
--- /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 0000000000..83e91156ee
--- /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 377f88c0e1..f4a7692cdf 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 b5cf58ace2..f47f7c8373 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 0000000000..10133e4b90
--- /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 0000000000..77cd83a0c6
--- /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"
--
2.14.3
From cd2de6083def3536d4f247bb4b251a99b770351a Mon Sep 17 00:00:00 2001
From: Alan Modra <amodra@gmail.com>
Date: Wed, 14 Feb 2018 11:38:03 +1030
Subject: [PATCH 2/2] PR22836 testcases
PR 22836
* testsuite/ld-elf/pr22836-1.s: New file.
* testsuite/ld-elf/pr22836-1a.d: Likewise.
* testsuite/ld-elf/pr22836-1b.d: Likewise.
(cherry picked from commit 60f763ee16fca2cd1ec9fa6960f765de9b26ef70)
---
ld/ChangeLog | 10 ++++++++++
ld/testsuite/ld-elf/pr22836-1.s | 4 ++++
ld/testsuite/ld-elf/pr22836-1a.d | 7 +++++++
ld/testsuite/ld-elf/pr22836-1b.d | 7 +++++++
4 files changed, 28 insertions(+)
create mode 100644 ld/testsuite/ld-elf/pr22836-1.s
create mode 100644 ld/testsuite/ld-elf/pr22836-1a.d
create mode 100644 ld/testsuite/ld-elf/pr22836-1b.d
diff --git a/ld/ChangeLog b/ld/ChangeLog
index f47f7c8373..6cea82b6ad 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,13 @@
+2018-03-19 H.J. Lu <hongjiu.lu@intel.com>
+
+ Backport from master branch
+ 2018-02-14 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR 22836
+ * testsuite/ld-elf/pr22836-1.s: New file.
+ * testsuite/ld-elf/pr22836-1a.d: Likewise.
+ * testsuite/ld-elf/pr22836-1b.d: Likewise.
+
2018-03-19 H.J. Lu <hongjiu.lu@intel.com>
Backport from master branch
diff --git a/ld/testsuite/ld-elf/pr22836-1.s b/ld/testsuite/ld-elf/pr22836-1.s
new file mode 100644
index 0000000000..8be549ecca
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr22836-1.s
@@ -0,0 +1,4 @@
+ .section .debug_macro,"G",%progbits,foo,comdat
+ .long .LASF0
+.LASF0:
+ .string "__STDC__ 1"
diff --git a/ld/testsuite/ld-elf/pr22836-1a.d b/ld/testsuite/ld-elf/pr22836-1a.d
new file mode 100644
index 0000000000..4acf45d421
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr22836-1a.d
@@ -0,0 +1,7 @@
+#source: pr22836-1.s
+#ld: -r -s
+#readelf: -g --wide
+#xfail: d30v-*-* dlx-*-* i960-*-* pj-*-*
+# Targets using the generic linker don't properly support comdat group sections
+
+There are no section groups in this file\.
diff --git a/ld/testsuite/ld-elf/pr22836-1b.d b/ld/testsuite/ld-elf/pr22836-1b.d
new file mode 100644
index 0000000000..30d6fa3f67
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr22836-1b.d
@@ -0,0 +1,7 @@
+#source: pr22836-1.s
+#ld: -r -S
+#readelf: -g --wide
+#xfail: d30v-*-* dlx-*-* i960-*-* pj-*-*
+# Targets using the generic linker don't properly support comdat group sections
+
+There are no section groups in this file\.
--
2.14.3