This is the mail archive of the binutils@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]

PATCH: PR ld/9727: "ld -r --gc-sections --entry" doesn't work with COMDAT group


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


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