This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PATCH: PR ld/9727: "ld -r --gc-sections --entry" doesn't work with COMDAT group
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: binutils at sources dot redhat dot com
- Date: Wed, 14 Jan 2009 10:05:54 -0800
- Subject: PATCH: PR ld/9727: "ld -r --gc-sections --entry" doesn't work with COMDAT group
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
When any section in a section group is kept, we keep all sections in the
section group. If the first member of the section group is excluded, we
should also exclude the group section. OK to install?
Thanks.
H.J.
---
bfd/
2009-01-14 H.J. Lu <hongjiu.lu@intel.com>
PR ld/9727
* elflink.c (elf_gc_sweep): Exclude the group section if the
the first member of the section group is excluded.
ld/testsuite/
2009-01-14 H.J. Lu <hongjiu.lu@intel.com>
PR ld/9727
* ld-elf/group8.s: New.
* ld-elf/group8a.d: Likewise.
* ld-elf/group8b.d: Likewise.
* ld-elf/group9.s: Likewise.
* ld-elf/group9a.d: Likewise.
* ld-elf/group9b.d: Likewise.
--- binutils/bfd/elflink.c.gc 2009-01-12 08:53:25.000000000 -0800
+++ binutils/bfd/elflink.c 2009-01-14 09:46:23.000000000 -0800
@@ -11482,10 +11482,21 @@ elf_gc_sweep (bfd *abfd, struct bfd_link
for (o = sub->sections; o != NULL; o = o->next)
{
- /* Keep debug and special sections. */
- if ((o->flags & (SEC_DEBUGGING | SEC_LINKER_CREATED)) != 0
- || (o->flags & (SEC_ALLOC | SEC_LOAD | SEC_RELOC)) == 0)
- o->gc_mark = 1;
+ /* When any section in a section group is kept, we keep all
+ sections in the section group. If the first member of
+ the section group is excluded, we will also exclude the
+ group section. */
+ if (o->flags & SEC_GROUP)
+ {
+ asection *first = elf_next_in_group (o);
+ o->gc_mark = first->gc_mark;
+ }
+ else if ((o->flags & (SEC_DEBUGGING | SEC_LINKER_CREATED)) != 0
+ || (o->flags & (SEC_ALLOC | SEC_LOAD | SEC_RELOC)) == 0)
+ {
+ /* Keep debug and special sections. */
+ o->gc_mark = 1;
+ }
if (o->gc_mark)
continue;
--- binutils/ld/testsuite/ld-elf/group8.s.gc 2009-01-14 09:57:04.000000000 -0800
+++ binutils/ld/testsuite/ld-elf/group8.s 2009-01-14 09:55:12.000000000 -0800
@@ -0,0 +1,10 @@
+ .section .text.foo,"axG",%progbits,foo,comdat
+ .globl foo
+ .type foo,%function
+foo:
+ .byte 0
+ .section .text.bar,"axG",%progbits,bar,comdat
+ .globl bar
+ .type bar,%function
+bar:
+ .byte 0
--- binutils/ld/testsuite/ld-elf/group8a.d.gc 2009-01-14 09:57:04.000000000 -0800
+++ binutils/ld/testsuite/ld-elf/group8a.d 2009-01-14 10:00:54.000000000 -0800
@@ -0,0 +1,8 @@
+#source: group8.s
+#ld: -r --gc-sections --entry foo
+#readelf: -g --wide
+#notarget: ia64-*-*
+
+COMDAT group section \[[ 0-9]+\] `.group' \[foo\] contains 1 sections:
+ \[Index\] Name
+ \[[ 0-9]+\] .text.foo
--- binutils/ld/testsuite/ld-elf/group8b.d.gc 2009-01-14 09:57:04.000000000 -0800
+++ binutils/ld/testsuite/ld-elf/group8b.d 2009-01-14 10:00:58.000000000 -0800
@@ -0,0 +1,8 @@
+#source: group8.s
+#ld: -r --gc-sections --entry bar
+#readelf: -g --wide
+#notarget: ia64-*-*
+
+COMDAT group section \[[ 0-9]+\] `.group' \[bar\] contains 1 sections:
+ \[Index\] Name
+ \[[ 0-9]+\] .text.bar
--- binutils/ld/testsuite/ld-elf/group9.s.gc 2009-01-14 09:57:04.000000000 -0800
+++ binutils/ld/testsuite/ld-elf/group9.s 2009-01-14 09:55:32.000000000 -0800
@@ -0,0 +1,15 @@
+ .section .text.foo,"axG",%progbits,foo,comdat
+ .globl foo
+ .type foo,%function
+foo:
+ .byte 0
+ .section .data.foo,"axG",%progbits,foo,comdat
+ .globl foo.data
+ .type foo,%object
+foo.data:
+ .byte 0
+ .section .text.bar,"axG",%progbits,bar,comdat
+ .globl bar
+ .type bar,%function
+bar:
+ .byte foo.data
--- binutils/ld/testsuite/ld-elf/group9a.d.gc 2009-01-14 09:57:04.000000000 -0800
+++ binutils/ld/testsuite/ld-elf/group9a.d 2009-01-14 10:01:01.000000000 -0800
@@ -0,0 +1,9 @@
+#source: group9.s
+#ld: -r --gc-sections --entry foo
+#readelf: -g --wide
+#notarget: ia64-*-*
+
+COMDAT group section \[[ 0-9]+\] `.group' \[foo\] contains 2 sections:
+ \[Index\] Name
+ \[[ 0-9]+\] .text.foo
+ \[[ 0-9]+\] .data.foo
--- binutils/ld/testsuite/ld-elf/group9b.d.gc 2009-01-14 09:57:04.000000000 -0800
+++ binutils/ld/testsuite/ld-elf/group9b.d 2009-01-14 10:01:05.000000000 -0800
@@ -0,0 +1,13 @@
+#source: group9.s
+#ld: -r --gc-sections --entry bar
+#readelf: -g --wide
+#notarget: ia64-*-*
+
+COMDAT group section \[[ 0-9]+\] `.group' \[foo\] contains 2 sections:
+ \[Index\] Name
+ \[[ 0-9]+\] .text.foo
+ \[[ 0-9]+\] .data.foo
+
+COMDAT group section \[[ 0-9]+\] `.group' \[bar\] contains 1 sections:
+ \[Index\] Name
+ \[[ 0-9]+\] .text.bar