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]

Re: PATCH: PR ld/13177: garbage collector retains zombie references to external libraries


On Tue, Oct 18, 2011 at 12:08:23PM -0700, H.J. Lu wrote:
> Done.

Thanks HJ.  I've just committed the following to mainline.  Please see
if you can break it.  ;-)

bfd/
	PR ld/13177
	* elflink.c (_bfd_elf_gc_mark_rsec): Set symbol "mark".
	(elf_gc_sweep_symbol): Don't test plt/got refcounts, instead test
	"mark".  Hide undefweak too.  Clear def_regular and ref_regular.
	* elf-m10300.c (mn10300_elf_relocate_section): Ignore unresolved
	reloc errors from garbage-collected code.
	* elf32-arm.c (elf32_arm_relocate_section): Likewise.
	* elf32-bfin.c (bfin_relocate_section): Likewise.
	(bfinfdpic_relocate_section): Likewise.
	* elf32-cris.c (cris_elf_relocate_section): Likewise.
	* elf32-frv.c (elf32_frv_relocate_section): Likewise.
	* elf32-i386.c (elf_i386_relocate_section): Likewise.
	* elf32-m32r.c (m32r_elf_relocate_section): Likewise.
	* elf32-m68k.c (elf_m68k_relocate_section): Likewise.
	* elf32-ppc.c (ppc_elf_relocate_section): Likewise.
	* elf32-s390.c (elf_s390_relocate_section): Likewise.
	* elf32-sh.c (sh_elf_relocate_section): Likewise.
	* elf32-spu.c (spu_elf_relocate_section): Likewise.
	* elf32-tilepro.c (tilepro_elf_relocate_section): Likewise.
	* elf32-xtensa.c (elf_xtensa_relocate_section): Likewise.
	* elf64-alpha.c (elf64_alpha_relocate_section): Likewise.
	* elf64-ppc.c (ppc64_elf_relocate_section): Likewise.
	* elf64-s390.c (elf_s390_relocate_section): Likewise.
	* elf64-sh64.c (sh_elf64_relocate_section): Likewise.
	* elf64-x86-64.c (elf_x86_64_relocate_section): Likewise.
	* elfxx-sparc.c (_bfd_sparc_elf_relocate_section): Likewise.
	* elfxx-tilegx.c (tilegx_elf_relocate_section): Likewise.
ld/testsuite/
	* ld-elf/elf.exp: Move test for shared lib support..
	* lib/ld-lib.exp (check_shared_lib_support): ..to here. Add m68hc1*,
	and s/ms1/mt/.
	(check_gc_sections_available): Match hppa*64 not hppa64.  Comment.
	* ld-gc/libpersonality.s: New.
	* ld-gc/personality.s, * ld-gc/personality.d: New.
	* ld-gc/gc.exp: Run personality test.

Index: bfd/elflink.c
===================================================================
RCS file: /cvs/src/src/bfd/elflink.c,v
retrieving revision 1.426
diff -u -p -r1.426 elflink.c
--- bfd/elflink.c	19 Oct 2011 04:13:28 -0000	1.426
+++ bfd/elflink.c	19 Oct 2011 05:00:46 -0000
@@ -11576,6 +11577,7 @@ _bfd_elf_gc_mark_rsec (struct bfd_link_i
       while (h->root.type == bfd_link_hash_indirect
 	     || h->root.type == bfd_link_hash_warning)
 	h = (struct elf_link_hash_entry *) h->root.u.i.link;
+      h->mark = 1;
       return (*gc_mark_hook) (sec, info, cookie->rel, h, NULL);
     }
 
@@ -11723,19 +11725,20 @@ struct elf_gc_sweep_symbol_info
 static bfd_boolean
 elf_gc_sweep_symbol (struct elf_link_hash_entry *h, void *data)
 {
-  if (((h->root.type == bfd_link_hash_defined
-	|| h->root.type == bfd_link_hash_defweak)
-       && !h->root.u.def.section->gc_mark
-       && (!(h->root.u.def.section->owner->flags & DYNAMIC)
-	   || (h->plt.refcount <= 0
-	       && h->got.refcount <= 0)))
-      || (h->root.type == bfd_link_hash_undefined
-	  && h->plt.refcount <= 0
-	  && h->got.refcount <= 0))
+  if (!h->mark
+      && (((h->root.type == bfd_link_hash_defined
+	    || h->root.type == bfd_link_hash_defweak)
+	   && !h->root.u.def.section->gc_mark)
+	  || h->root.type == bfd_link_hash_undefined
+	  || h->root.type == bfd_link_hash_undefweak))
     {
-      struct elf_gc_sweep_symbol_info *inf =
-	(struct elf_gc_sweep_symbol_info *) data;
+      struct elf_gc_sweep_symbol_info *inf;
+
+      inf = (struct elf_gc_sweep_symbol_info *) data;
       (*inf->hide_symbol) (inf->info, h, TRUE);
+      h->def_regular = 0;
+      h->ref_regular = 0;
+      h->ref_regular_nonweak = 0;
     }
 
   return TRUE;
Index: bfd/elf-m10300.c
===================================================================
RCS file: /cvs/src/src/bfd/elf-m10300.c,v
retrieving revision 1.108
diff -u -p -r1.108 elf-m10300.c
--- bfd/elf-m10300.c	13 Jun 2011 00:59:09 -0000	1.108
+++ bfd/elf-m10300.c	19 Oct 2011 05:00:23 -0000
@@ -1499,7 +1499,10 @@ mn10300_elf_relocate_section (bfd *outpu
 	       obscure cases sec->output_section will be NULL.  */
 	    relocation = 0;
 
-	  else if (!info->relocatable && unresolved_reloc)
+	  else if (!info->relocatable && unresolved_reloc
+		   && _bfd_elf_section_offset (output_bfd, info, input_section,
+					       rel->r_offset) != (bfd_vma) -1)
+
 	    (*_bfd_error_handler)
 	      (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
 	       input_bfd,
Index: bfd/elf32-arm.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-arm.c,v
retrieving revision 1.277
diff -u -p -r1.277 elf32-arm.c
--- bfd/elf32-arm.c	13 Oct 2011 09:47:51 -0000	1.277
+++ bfd/elf32-arm.c	19 Oct 2011 05:00:26 -0000
@@ -10386,7 +10386,9 @@ elf32_arm_relocate_section (bfd *       
 	 not process them.  */
       if (unresolved_reloc
           && !((input_section->flags & SEC_DEBUGGING) != 0
-               && h->def_dynamic))
+               && h->def_dynamic)
+	  && _bfd_elf_section_offset (output_bfd, info, input_section,
+				      rel->r_offset) != (bfd_vma) -1)
 	{
 	  (*_bfd_error_handler)
 	    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
Index: bfd/elf32-bfin.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-bfin.c,v
retrieving revision 1.54
diff -u -p -r1.54 elf32-bfin.c
--- bfd/elf32-bfin.c	13 Jun 2011 00:59:10 -0000	1.54
+++ bfd/elf32-bfin.c	19 Oct 2011 05:00:27 -0000
@@ -1585,7 +1585,9 @@ bfin_relocate_section (bfd * output_bfd,
          because such sections are not SEC_ALLOC and thus ld.so will
          not process them.  */
       if (unresolved_reloc
-	  && !((input_section->flags & SEC_DEBUGGING) != 0 && h->def_dynamic))
+	  && !((input_section->flags & SEC_DEBUGGING) != 0 && h->def_dynamic)
+	  && _bfd_elf_section_offset (output_bfd, info, input_section,
+				      rel->r_offset) != (bfd_vma) -1)
 	{
 	  (*_bfd_error_handler)
 	    (_("%B(%A+0x%lx): unresolvable relocation against symbol `%s'"),
@@ -2731,7 +2733,9 @@ bfinfdpic_relocate_section (bfd * output
 	default:
 	non_fdpic:
 	  picrel = NULL;
-	  if (h && ! BFINFDPIC_SYM_LOCAL (info, h))
+	  if (h && ! BFINFDPIC_SYM_LOCAL (info, h)
+	      && _bfd_elf_section_offset (output_bfd, info, input_section,
+					  rel->r_offset) != (bfd_vma) -1)
 	    {
 	      info->callbacks->warning
 		(info, _("relocation references symbol not defined in the module"),
Index: bfd/elf32-cris.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-cris.c,v
retrieving revision 1.116
diff -u -p -r1.116 elf32-cris.c
--- bfd/elf32-cris.c	14 Oct 2011 06:52:46 -0000	1.116
+++ bfd/elf32-cris.c	19 Oct 2011 05:00:28 -0000
@@ -1166,7 +1166,11 @@ cris_elf_relocate_section (bfd *output_b
 		      || r_type == R_CRIS_16_PCREL
 		      || r_type == R_CRIS_32_PCREL))
 		relocation = 0;
-	      else if (!info->relocatable && unresolved_reloc)
+	      else if (!info->relocatable && unresolved_reloc
+		       && (_bfd_elf_section_offset (output_bfd, info,
+						    input_section,
+						    rel->r_offset)
+			   != (bfd_vma) -1))
 		{
 		  _bfd_error_handler
 		    (_("%B, section %A: unresolvable relocation %s against symbol `%s'"),
Index: bfd/elf32-frv.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-frv.c,v
retrieving revision 1.73
diff -u -p -r1.73 elf32-frv.c
--- bfd/elf32-frv.c	23 May 2011 06:14:21 -0000	1.73
+++ bfd/elf32-frv.c	19 Oct 2011 05:00:29 -0000
@@ -2896,7 +2896,10 @@ elf32_frv_relocate_section (output_bfd, 
 	default:
 	non_fdpic:
 	  picrel = NULL;
-	  if (h && ! FRVFDPIC_SYM_LOCAL (info, h))
+	  if (h
+	      && ! FRVFDPIC_SYM_LOCAL (info, h)
+	      && _bfd_elf_section_offset (output_bfd, info, input_section,
+					  rel->r_offset) != (bfd_vma) -1)
 	    {
 	      info->callbacks->einfo
 		(_("%H: relocation references symbol"
Index: bfd/elf32-i386.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-i386.c,v
retrieving revision 1.260
diff -u -p -r1.260 elf32-i386.c
--- bfd/elf32-i386.c	28 Jul 2011 22:35:15 -0000	1.260
+++ bfd/elf32-i386.c	19 Oct 2011 05:00:30 -0000
@@ -4244,7 +4237,9 @@ elf_i386_relocate_section (bfd *output_b
 	 not process them.  */
       if (unresolved_reloc
 	  && !((input_section->flags & SEC_DEBUGGING) != 0
-	       && h->def_dynamic))
+	       && h->def_dynamic)
+	  && _bfd_elf_section_offset (output_bfd, info, input_section,
+				      rel->r_offset) != (bfd_vma) -1)
 	{
 	  (*_bfd_error_handler)
 	    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
Index: bfd/elf32-m32r.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-m32r.c,v
retrieving revision 1.102
diff -u -p -r1.102 elf32-m32r.c
--- bfd/elf32-m32r.c	13 Jun 2011 00:59:10 -0000	1.102
+++ bfd/elf32-m32r.c	19 Oct 2011 05:00:31 -0000
@@ -2589,7 +2589,11 @@ m32r_elf_relocate_section (bfd *output_b
 		relocation = (h->root.u.def.value
 			      + sec->output_section->vma
 			      + sec->output_offset);
-	      else if (!info->relocatable)
+	      else if (!info->relocatable
+		       && (_bfd_elf_section_offset (output_bfd, info,
+						    input_section,
+						    rel->r_offset)
+			   != (bfd_vma) -1))
 		{
 		  (*_bfd_error_handler)
 		    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
Index: bfd/elf32-m68k.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-m68k.c,v
retrieving revision 1.126
diff -u -p -r1.126 elf32-m68k.c
--- bfd/elf32-m68k.c	13 Jun 2011 00:59:10 -0000	1.126
+++ bfd/elf32-m68k.c	19 Oct 2011 05:00:32 -0000
@@ -4148,7 +4148,9 @@ elf_m68k_relocate_section (output_bfd, i
 	 not process them.  */
       if (unresolved_reloc
 	  && !((input_section->flags & SEC_DEBUGGING) != 0
-	       && h->def_dynamic))
+	       && h->def_dynamic)
+	  && _bfd_elf_section_offset (output_bfd, info, input_section,
+				      rel->r_offset) != (bfd_vma) -1)
 	{
 	  (*_bfd_error_handler)
 	    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
Index: bfd/elf32-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-ppc.c,v
retrieving revision 1.302
diff -u -p -r1.302 elf32-ppc.c
--- bfd/elf32-ppc.c	14 Aug 2011 09:17:17 -0000	1.302
+++ bfd/elf32-ppc.c	19 Oct 2011 05:00:33 -0000
@@ -8150,7 +8150,9 @@ ppc_elf_relocate_section (bfd *output_bf
 
       if (unresolved_reloc
 	  && !((input_section->flags & SEC_DEBUGGING) != 0
-	       && h->def_dynamic))
+	       && h->def_dynamic)
+	  && _bfd_elf_section_offset (output_bfd, info, input_section,
+				      rel->r_offset) != (bfd_vma) -1)
 	{
 	  info->callbacks->einfo
 	    (_("%P: %H: unresolvable %s relocation against symbol `%s'\n"),
Index: bfd/elf32-s390.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-s390.c,v
retrieving revision 1.108
diff -u -p -r1.108 elf32-s390.c
--- bfd/elf32-s390.c	13 Jun 2011 00:59:11 -0000	1.108
+++ bfd/elf32-s390.c	19 Oct 2011 05:00:34 -0000
@@ -2996,7 +2996,9 @@ elf_s390_relocate_section (output_bfd, i
 	 not process them.  */
       if (unresolved_reloc
 	  && !((input_section->flags & SEC_DEBUGGING) != 0
-	       && h->def_dynamic))
+	       && h->def_dynamic)
+	  && _bfd_elf_section_offset (output_bfd, info, input_section,
+				      rel->r_offset) != (bfd_vma) -1)
 	(*_bfd_error_handler)
 	  (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
 	   input_bfd,
Index: bfd/elf32-sh.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-sh.c,v
retrieving revision 1.172
diff -u -p -r1.172 elf32-sh.c
--- bfd/elf32-sh.c	22 Jun 2011 22:02:16 -0000	1.172
+++ bfd/elf32-sh.c	19 Oct 2011 05:00:35 -0000
@@ -4208,7 +4208,11 @@ sh_elf_relocate_section (bfd *output_bfd
 				 STT_DATALABEL on the way to it.  */
 			      | ((h->other & STO_SH5_ISA32) != 0
 				 && ! seen_stt_datalabel));
-	      else if (!info->relocatable)
+	      else if (!info->relocatable
+		       && (_bfd_elf_section_offset (output_bfd, info,
+						    input_section,
+						    rel->r_offset)
+			   != (bfd_vma) -1))
 		{
 		  (*_bfd_error_handler)
 		    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
Index: bfd/elf32-spu.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-spu.c,v
retrieving revision 1.101
diff -u -p -r1.101 elf32-spu.c
--- bfd/elf32-spu.c	28 Feb 2011 18:30:16 -0000	1.101
+++ bfd/elf32-spu.c	19 Oct 2011 05:00:36 -0000
@@ -5000,7 +5000,9 @@ spu_elf_relocate_section (bfd *output_bf
       else if (is_ea_sym)
 	unresolved_reloc = TRUE;
 
-      if (unresolved_reloc)
+      if (unresolved_reloc
+	  && _bfd_elf_section_offset (output_bfd, info, input_section,
+				      rel->r_offset) != (bfd_vma) -1)
 	{
 	  (*_bfd_error_handler)
 	    (_("%B(%s+0x%lx): unresolvable %s relocation against symbol `%s'"),
Index: bfd/elf32-tilepro.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-tilepro.c,v
retrieving revision 1.3
diff -u -p -r1.3 elf32-tilepro.c
--- bfd/elf32-tilepro.c	14 Jun 2011 04:03:23 -0000	1.3
+++ bfd/elf32-tilepro.c	19 Oct 2011 05:00:36 -0000
@@ -3110,7 +3110,9 @@ tilepro_elf_relocate_section (bfd *outpu
 	 not process them.  */
       if (unresolved_reloc
 	  && !((input_section->flags & SEC_DEBUGGING) != 0
-	       && h->def_dynamic))
+	       && h->def_dynamic)
+	  && _bfd_elf_section_offset (output_bfd, info, input_section,
+				      rel->r_offset) != (bfd_vma) -1)
 	(*_bfd_error_handler)
 	  (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
 	   input_bfd,
Index: bfd/elf32-xtensa.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-xtensa.c,v
retrieving revision 1.130
diff -u -p -r1.130 elf32-xtensa.c
--- bfd/elf32-xtensa.c	13 Jun 2011 00:59:11 -0000	1.130
+++ bfd/elf32-xtensa.c	19 Oct 2011 05:00:38 -0000
@@ -3058,7 +3058,9 @@ elf_xtensa_relocate_section (bfd *output
 	 not process them.  */
       if (unresolved_reloc
 	  && !((input_section->flags & SEC_DEBUGGING) != 0
-	       && h->def_dynamic))
+	       && h->def_dynamic)
+	  && _bfd_elf_section_offset (output_bfd, info, input_section,
+				      rel->r_offset) != (bfd_vma) -1)
 	{
 	  (*_bfd_error_handler)
 	    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
Index: bfd/elf64-alpha.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-alpha.c,v
retrieving revision 1.181
diff -u -p -r1.181 elf64-alpha.c
--- bfd/elf64-alpha.c	30 Sep 2011 10:39:45 -0000	1.181
+++ bfd/elf64-alpha.c	19 Oct 2011 05:00:39 -0000
@@ -4213,6 +4213,7 @@ elf64_alpha_relocate_section (bfd *outpu
       bfd_vma value;
       bfd_vma addend;
       bfd_boolean dynamic_symbol_p;
+      bfd_boolean unresolved_reloc = FALSE;
       bfd_boolean undef_weak_ref = FALSE;
       unsigned long r_type;
 
@@ -4294,7 +4295,6 @@ elf64_alpha_relocate_section (bfd *outpu
       else
 	{
 	  bfd_boolean warned;
-	  bfd_boolean unresolved_reloc;
 	  struct elf_link_hash_entry *hh;
 	  struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
 
@@ -4527,7 +4527,12 @@ elf64_alpha_relocate_section (bfd *outpu
 	    else if (info->shared
 		     && r_symndx != STN_UNDEF
 		     && (input_section->flags & SEC_ALLOC)
-		     && !undef_weak_ref)
+		     && !undef_weak_ref
+		     && !(unresolved_reloc
+			  && (_bfd_elf_section_offset (output_bfd, info,
+						       input_section,
+						       rel->r_offset)
+			      == (bfd_vma) -1)))
 	      {
 		if (r_type == R_ALPHA_REFLONG)
 		  {
@@ -4573,7 +4578,11 @@ elf64_alpha_relocate_section (bfd *outpu
 	  /* ??? .eh_frame references to discarded sections will be smashed
 	     to relocations against SHN_UNDEF.  The .eh_frame format allows
 	     NULL to be encoded as 0 in any format, so this works here.  */
-	  if (r_symndx == STN_UNDEF)
+	  if (r_symndx == STN_UNDEF
+	      || (unresolved_reloc
+		  && _bfd_elf_section_offset (output_bfd, info,
+					      input_section,
+					      rel->r_offset) == (bfd_vma) -1))
 	    howto = (elf64_alpha_howto_table
 		     + (r_type - R_ALPHA_SREL32 + R_ALPHA_REFLONG));
 	  goto default_reloc;
Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.366
diff -u -p -r1.366 elf64-ppc.c
--- bfd/elf64-ppc.c	17 Oct 2011 08:27:45 -0000	1.366
+++ bfd/elf64-ppc.c	19 Oct 2011 05:00:42 -0000
@@ -13459,7 +13459,9 @@ ppc64_elf_relocate_section (bfd *output_
 	 not process them.  */
       if (unresolved_reloc
 	  && !((input_section->flags & SEC_DEBUGGING) != 0
-	       && h->elf.def_dynamic))
+	       && h->elf.def_dynamic)
+	  && _bfd_elf_section_offset (output_bfd, info, input_section,
+				      rel->r_offset) != (bfd_vma) -1)
 	{
 	  info->callbacks->einfo
 	    (_("%P: %H: unresolvable %s relocation against symbol `%s'\n"),
Index: bfd/elf64-s390.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-s390.c,v
retrieving revision 1.108
diff -u -p -r1.108 elf64-s390.c
--- bfd/elf64-s390.c	13 Jun 2011 00:59:12 -0000	1.108
+++ bfd/elf64-s390.c	19 Oct 2011 05:00:42 -0000
@@ -2971,7 +2971,9 @@ elf_s390_relocate_section (bfd *output_b
 	 not process them.  */
       if (unresolved_reloc
 	  && !((input_section->flags & SEC_DEBUGGING) != 0
-	       && h->def_dynamic))
+	       && h->def_dynamic)
+	  && _bfd_elf_section_offset (output_bfd, info, input_section,
+				      rel->r_offset) != (bfd_vma) -1)
 	(*_bfd_error_handler)
 	  (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
 	   input_bfd,
Index: bfd/elf64-sh64.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-sh64.c,v
retrieving revision 1.87
diff -u -p -r1.87 elf64-sh64.c
--- bfd/elf64-sh64.c	13 Jun 2011 00:59:13 -0000	1.87
+++ bfd/elf64-sh64.c	19 Oct 2011 05:00:43 -0000
@@ -1630,7 +1630,11 @@ sh_elf64_relocate_section (bfd *output_b
 				 STT_DATALABEL on the way to it.  */
 			      | ((h->other & STO_SH5_ISA32) != 0
 				 && ! seen_stt_datalabel));
-	      else if (!info->relocatable)
+	      else if (!info->relocatable
+		       && (_bfd_elf_section_offset (output_bfd, info,
+						    input_section,
+						    rel->r_offset)
+			   != (bfd_vma) -1))
 		{
 		  (*_bfd_error_handler)
 		    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
Index: bfd/elf64-x86-64.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-x86-64.c,v
retrieving revision 1.239
diff -u -p -r1.239 elf64-x86-64.c
--- bfd/elf64-x86-64.c	12 Aug 2011 19:42:39 -0000	1.239
+++ bfd/elf64-x86-64.c	19 Oct 2011 05:00:44 -0000
@@ -4103,7 +4086,9 @@ elf_x86_64_relocate_section (bfd *output
 	 not process them.  */
       if (unresolved_reloc
 	  && !((input_section->flags & SEC_DEBUGGING) != 0
-	       && h->def_dynamic))
+	       && h->def_dynamic)
+	  && _bfd_elf_section_offset (output_bfd, info, input_section,
+				      rel->r_offset) != (bfd_vma) -1)
 	(*_bfd_error_handler)
 	  (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
 	   input_bfd,
Index: bfd/elfxx-sparc.c
===================================================================
RCS file: /cvs/src/src/bfd/elfxx-sparc.c,v
retrieving revision 1.61
diff -u -p -r1.61 elfxx-sparc.c
--- bfd/elfxx-sparc.c	19 Oct 2011 00:32:24 -0000	1.61
+++ bfd/elfxx-sparc.c	19 Oct 2011 05:00:50 -0000
@@ -3828,7 +3828,9 @@ _bfd_sparc_elf_relocate_section (bfd *ou
 	 not process them.  */
       if (unresolved_reloc
 	  && !((input_section->flags & SEC_DEBUGGING) != 0
-	       && h->def_dynamic))
+	       && h->def_dynamic)
+	  && _bfd_elf_section_offset (output_bfd, info, input_section,
+				      rel->r_offset) != (bfd_vma) -1)
 	(*_bfd_error_handler)
 	  (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
 	   input_bfd,
Index: bfd/elfxx-tilegx.c
===================================================================
RCS file: /cvs/src/src/bfd/elfxx-tilegx.c,v
retrieving revision 1.3
diff -u -p -r1.3 elfxx-tilegx.c
--- bfd/elfxx-tilegx.c	14 Jun 2011 04:03:23 -0000	1.3
+++ bfd/elfxx-tilegx.c	19 Oct 2011 05:00:51 -0000
@@ -3493,7 +3493,9 @@ tilegx_elf_relocate_section (bfd *output
 	 not process them.  */
       if (unresolved_reloc
 	  && !((input_section->flags & SEC_DEBUGGING) != 0
-	       && h->def_dynamic))
+	       && h->def_dynamic)
+	  && _bfd_elf_section_offset (output_bfd, info, input_section,
+				      rel->r_offset) != (bfd_vma) -1)
 	(*_bfd_error_handler)
 	  (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
 	   input_bfd,
Index: ld/testsuite/ld-elf/elf.exp
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-elf/elf.exp,v
retrieving revision 1.30
diff -u -p -r1.30 elf.exp
--- ld/testsuite/ld-elf/elf.exp	7 Oct 2011 19:55:47 -0000	1.30
+++ ld/testsuite/ld-elf/elf.exp	19 Oct 2011 05:01:11 -0000
@@ -58,40 +58,7 @@ if { ![istarget hppa64*-hpux*] } {
 # should not seg-fault whilst creating the binary.
 #
 # Only run the test on targets thats support creating shared libraries.
-if {    ! [istarget arc-*-*]
-     && ! [istarget avr-*-*]
-     && ! [istarget cr16-*-*]
-     && ! [istarget cris*-*-*]
-     && ! [istarget crx-*-*]
-     && ! [istarget d10v-*-*]
-     && ! [istarget d30v-*-*]
-     && ! [istarget dlx-*-*]
-     && ! [istarget fr30-*-*]
-     && ! [istarget frv-*-*]
-     && ! [istarget h8300-*-*]
-     && ! [istarget i860-*-*]
-     && ! [istarget i960-*-*]
-     && ! [istarget ip2k-*-*]
-     && ! [istarget iq2000-*-*]
-     && ! [istarget lm32-*-*]
-     && ! [istarget m32c-*-*]
-     && ! [istarget m32r-*-*]
-     && ! [istarget mcore*-*-*]
-     && ! [istarget mep-*-*]
-     && ! [istarget microblaze-*-*]
-     && ! [istarget mn10200-*-*]
-     && ! [istarget moxie-*-*]
-     && ! [istarget ms1-*-*]
-     && ! [istarget msp430-*-*]
-     && ! [istarget openrisc-*-*]
-     && ! [istarget or32-*-*]
-     && ! [istarget pj-*-*]
-     && ! [istarget rx-*-*]
-     && ! [istarget spu-*-*]
-     && ! [istarget v850*-*-*]
-     && ! [istarget xstormy16-*-*]
-     && ! [istarget *-*-irix*]
-     && ! [istarget *-*-rtems] } {
+if { [check_shared_lib_support] } then {
   run_ld_link_tests {
       {"Build shared library for next test"
        "-shared" "" "note-3.s" {} "note-3.so" }
Index: ld/testsuite/lib/ld-lib.exp
===================================================================
RCS file: /cvs/src/src/ld/testsuite/lib/ld-lib.exp,v
retrieving revision 1.85
diff -u -p -r1.85 ld-lib.exp
--- ld/testsuite/lib/ld-lib.exp	24 Jul 2011 14:20:12 -0000	1.85
+++ ld/testsuite/lib/ld-lib.exp	19 Oct 2011 05:01:13 -0000
@@ -1418,7 +1418,7 @@ proc check_gc_sections_available { } {
 	     || [istarget or32-*-*]
 	     || [istarget pj*-*-*]
 	     || [istarget alpha-*-*]
-	     || [istarget hppa64-*-*]
+	     || [istarget hppa*64-*-*]
 	     || [istarget i370-*-*]
 	     || [istarget i860-*-*]
 	     || [istarget ia64-*-*]
@@ -1439,6 +1439,8 @@ proc check_gc_sections_available { } {
 	}
 
 	# Check if the ld used by gcc supports --gc-sections.
+	# FIXME: this test is useless since ld --help always says
+	# --gc-sections is available
 	set ld_output [remote_exec host $ld "--help"]
 	if { [ string first "--gc-sections" $ld_output ] >= 0 } {
 	    set gc_sections_available_saved 1
@@ -1449,6 +1451,50 @@ proc check_gc_sections_available { } {
     return $gc_sections_available_saved
 }
 
+# Returns true if -shared is supported on the target
+# Only used and accurate for ELF targets at the moment
+
+proc check_shared_lib_support { } {
+    if {![istarget arc-*-*]
+	 && ![istarget avr-*-*]
+	 && ![istarget cr16-*-*]
+	 && ![istarget cris*-*-*]
+	 && ![istarget crx-*-*]
+	 && ![istarget d10v-*-*]
+	 && ![istarget d30v-*-*]
+	 && ![istarget dlx-*-*]
+	 && ![istarget fr30-*-*]
+	 && ![istarget frv-*-*]
+	 && ![istarget h8300-*-*]
+	 && ![istarget i860-*-*]
+	 && ![istarget i960-*-*]
+	 && ![istarget ip2k-*-*]
+	 && ![istarget iq2000-*-*]
+	 && ![istarget lm32-*-*]
+	 && ![istarget m32c-*-*]
+	 && ![istarget m32r-*-*]
+	 && ![istarget m68hc1*-*-*]
+	 && ![istarget mcore*-*-*]
+	 && ![istarget mep-*-*]
+	 && ![istarget microblaze-*-*]
+	 && ![istarget mn10200-*-*]
+	 && ![istarget moxie-*-*]
+	 && ![istarget msp430-*-*]
+	 && ![istarget mt-*-*]
+	 && ![istarget openrisc-*-*]
+	 && ![istarget or32-*-*]
+	 && ![istarget pj-*-*]
+	 && ![istarget rx-*-*]
+	 && ![istarget spu-*-*]
+	 && ![istarget v850*-*-*]
+	 && ![istarget xstormy16-*-*]
+	 && ![istarget *-*-irix*]
+	 && ![istarget *-*-rtems] } {
+	return 1
+    }
+    return 0
+}
+
 # Returns true if the target ld supports the plugin API.
 proc check_plugin_api_available { } {
     global plugin_api_available_saved
Index: ld/testsuite/ld-gc/gc.exp
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-gc/gc.exp,v
retrieving revision 1.11
diff -u -p -r1.11 gc.exp
--- ld/testsuite/ld-gc/gc.exp	9 Feb 2011 08:18:54 -0000	1.11
+++ ld/testsuite/ld-gc/gc.exp	19 Oct 2011 07:10:11 -0000
@@ -97,6 +97,20 @@ test_gc "Check --gc-section/-r/-u" "gcre
 run_dump_test "noent"
 run_dump_test "abi-note"
 run_dump_test "start"
+
+if { [is_elf_format] && [check_shared_lib_support] } then {
+    set gasopt ""
+    if { [istarget tic6x-*] } then {
+	set gasopt "-mpic -mpid=near"
+    }
+    if {![ld_assemble_flags $as $gasopt $srcdir/$subdir/libpersonality.s tmpdir/libpersonality.o]
+	|| ![ld_simple_link $ld tmpdir/libpersonality.so "-shared tmpdir/libpersonality.o"] } then {
+	fail libpersonality
+    } else {
+	run_dump_test "personality"
+    }
+}
+
 if { [is_remote host] || [which $CC] != 0 } {
     if { [istarget "*-*-linux*"]
 	 || [istarget "*-*-gnu*"] } {
Index: ld/testsuite/ld-gc/libpersonality.s
===================================================================
RCS file: ld/testsuite/ld-gc/libpersonality.s
diff -N ld/testsuite/ld-gc/libpersonality.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-gc/libpersonality.s	19 Oct 2011 07:10:11 -0000
@@ -0,0 +1,11 @@
+	.weak	__gxx_personality_v0
+	.type	__gxx_personality_v0,%function
+__gxx_personality_v0:
+	.long 0
+	.size	__gxx_personality_v0, . - __gxx_personality_v0
+
+	.globl	__gxx_personality_v1
+	.type	__gxx_personality_v1,%function
+__gxx_personality_v1:
+	.long 0
+	.size	__gxx_personality_v1, . - __gxx_personality_v1
Index: ld/testsuite/ld-gc/personality.d
===================================================================
RCS file: ld/testsuite/ld-gc/personality.d
diff -N ld/testsuite/ld-gc/personality.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-gc/personality.d	19 Oct 2011 07:10:11 -0000
@@ -0,0 +1,10 @@
+#name: --gc-sections with __gxx_personality
+#ld: --gc-sections -e main -L tmpdir -lpersonality
+#nm: -n
+#xfail: bfin-*-* cris*-*-* frv-*-* mn10300-*-* vax-*-* xtensa-*-*
+# above targets don't support cfi
+
+#failif
+#...
+.*gxx_personality.*
+#...
Index: ld/testsuite/ld-gc/personality.s
===================================================================
RCS file: ld/testsuite/ld-gc/personality.s
diff -N ld/testsuite/ld-gc/personality.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-gc/personality.s	19 Oct 2011 07:10:11 -0000
@@ -0,0 +1,28 @@
+	.section	.text.loseme,"ax",%progbits
+	.globl	loseme
+	.type	loseme,%function
+loseme:
+	.cfi_startproc
+	.cfi_personality 0,__gxx_personality_v0
+	.long 0
+	.cfi_endproc
+	.size loseme, . - loseme
+
+	.section	.text.loseme2,"ax",%progbits
+	.globl	loseme2
+	.type	loseme2,%function
+loseme2:
+	.cfi_startproc
+	.cfi_personality 0,__gxx_personality_v1
+	.long 0
+	.cfi_endproc
+	.size loseme2, . - loseme2
+
+	.section	.text.main,"ax",%progbits
+	.globl	main
+	.type	main, %function
+main:
+	.cfi_startproc
+	.long 0
+	.cfi_endproc
+	.size main, . - main


-- 
Alan Modra
Australia Development Lab, IBM


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