bfd/
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 14 Jan 2009 21:52:49 +0000 (21:52 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 14 Jan 2009 21:52:49 +0000 (21:52 +0000)
2009-01-14  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/9727
* elflink.c (elf_gc_sweep): Exclude the group section if 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.

bfd/ChangeLog
bfd/elflink.c
ld/testsuite/ChangeLog
ld/testsuite/ld-elf/group8.s [new file with mode: 0644]
ld/testsuite/ld-elf/group8a.d [new file with mode: 0644]
ld/testsuite/ld-elf/group8b.d [new file with mode: 0644]
ld/testsuite/ld-elf/group9.s [new file with mode: 0644]
ld/testsuite/ld-elf/group9a.d [new file with mode: 0644]
ld/testsuite/ld-elf/group9b.d [new file with mode: 0644]

index e45d26274c340e4cb23635b7dbe5d75f4157e183..bc2df92985231667ac8cb2183fc2262df069b1f5 100644 (file)
@@ -1,3 +1,9 @@
+2009-01-14  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/9727
+       * elflink.c (elf_gc_sweep): Exclude the group section if the
+       first member of the section group is excluded.
+
 2009-01-14  Alan Modra  <amodra@bigpond.net.au>
 
        PR 9735
index 29523c4614e7dad5a099bfc485bbb6798e0b1107..d2cc31a8b1626f62819b35c36c67af5d0d227ef9 100644 (file)
@@ -11397,10 +11397,21 @@ elf_gc_sweep (bfd *abfd, struct bfd_link_info *info)
 
       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;
index ae1513dc1822349d18ec3900fcb03d5eae7794ec..fe0d80239a506bb8d38d24818db73932aec8d214 100644 (file)
@@ -1,3 +1,13 @@
+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.
+
 2009-01-13  Alan Modra  <amodra@bigpond.net.au>
 
        * ld-spu/icache1.s: New file.
diff --git a/ld/testsuite/ld-elf/group8.s b/ld/testsuite/ld-elf/group8.s
new file mode 100644 (file)
index 0000000..7766c6c
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-elf/group8a.d b/ld/testsuite/ld-elf/group8a.d
new file mode 100644 (file)
index 0000000..1efd6f3
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-elf/group8b.d b/ld/testsuite/ld-elf/group8b.d
new file mode 100644 (file)
index 0000000..95ea439
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-elf/group9.s b/ld/testsuite/ld-elf/group9.s
new file mode 100644 (file)
index 0000000..1e6bcff
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-elf/group9a.d b/ld/testsuite/ld-elf/group9a.d
new file mode 100644 (file)
index 0000000..7f85100
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-elf/group9b.d b/ld/testsuite/ld-elf/group9b.d
new file mode 100644 (file)
index 0000000..82ca062
--- /dev/null
@@ -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