public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* gc-sections and DWARF ranges
@ 2010-10-21 21:41 Daniel Jacobowitz
  2010-10-21 23:34 ` Alan Modra
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Daniel Jacobowitz @ 2010-10-21 21:41 UTC (permalink / raw)
  To: binutils

I found a test today where GDB fails to find symbol info.  It's not
GDB's fault, though: there's an input .o file which has eleven entries
in .debug_ranges, and then there's only nine by the end of the link.
The tenth was for a GC'd section.  The eleventh, by bad luck, happens
to be main.

Cary fixed a specific case of this problem in GCC by emitting fewer ranges:

  http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42454

That doesn't solve the general problem if there's actual garbage
collection.

Is there any provision in GNU ld for this that I'm not seeing?  We
ought to remove discarded entries with knowledge of the .debug_ranges
output; I don't see how we can get this right otherwise.

I can make a good argument that every debug section with references to
the discarded section must have special processing, or we are
generating broken debug output - GDB's workaround for functions at
address 0 is another case.  That one can be solved by use of section
groups, but the compile unit's .debug_ranges has to be a single entity.

-- 
Daniel Jacobowitz
CodeSourcery

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: gc-sections and DWARF ranges
  2010-10-21 21:41 gc-sections and DWARF ranges Daniel Jacobowitz
@ 2010-10-21 23:34 ` Alan Modra
  2010-10-22  2:35   ` Daniel Jacobowitz
  2010-10-22 15:40 ` Richard Henderson
  2010-10-22 18:23 ` Cary Coutant
  2 siblings, 1 reply; 11+ messages in thread
From: Alan Modra @ 2010-10-21 23:34 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: binutils

On Thu, Oct 21, 2010 at 05:41:00PM -0400, Daniel Jacobowitz wrote:
> Is there any provision in GNU ld for this that I'm not seeing?

Not that I know of.

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: gc-sections and DWARF ranges
  2010-10-21 23:34 ` Alan Modra
@ 2010-10-22  2:35   ` Daniel Jacobowitz
  2010-10-22  4:16     ` Alan Modra
  0 siblings, 1 reply; 11+ messages in thread
From: Daniel Jacobowitz @ 2010-10-22  2:35 UTC (permalink / raw)
  To: binutils

On Fri, Oct 22, 2010 at 10:04:39AM +1030, Alan Modra wrote:
> On Thu, Oct 21, 2010 at 05:41:00PM -0400, Daniel Jacobowitz wrote:
> > Is there any provision in GNU ld for this that I'm not seeing?
> 
> Not that I know of.

What's your opinion of a flat-out hack then?  This would need an
update to other targets, but it works for x86_64.

-- 
Daniel Jacobowitz
CodeSourcery

2010-10-21  Daniel Jacobowitz  <dan@codesourcery.com>

	* elf-bfd.h (RELOC_AGAINST_DISCARDED_SECTION): Always call
	_bfd_clear_contents.  Pass it the input section.
	* elf32-arm.c (elf32_arm_relocate_section): Use
	RELOC_AGAINST_DISCARDED_SECTION.
	* libbfd-in.h (_bfd_clear_contents): Add input_section argument.
	* libbfd.h: Regenerate.
	* reloc.c (_bfd_clear_contents): Take input_section argument.
	Use non-zero for .debug_ranges.
	(bfd_generic_get_relocated_section_conten): Update _bfd_clear_contents
	call.

Index: elf-bfd.h
===================================================================
RCS file: /cvs/src/src/bfd/elf-bfd.h,v
retrieving revision 1.311
diff -u -p -r1.311 elf-bfd.h
--- elf-bfd.h	21 Oct 2010 12:29:01 -0000	1.311
+++ elf-bfd.h	22 Oct 2010 02:32:50 -0000
@@ -2355,6 +2355,9 @@ extern asection _bfd_elf_large_com_secti
 #define RELOC_AGAINST_DISCARDED_SECTION(info, input_bfd, input_section,	\
 					rel, relend, howto, contents)	\
   {									\
+    _bfd_clear_contents (howto, input_bfd, input_section,		\
+			 contents + rel->r_offset);			\
+									\
     if (info->relocatable						\
 	&& (input_section->flags & SEC_DEBUGGING))			\
       {									\
@@ -2380,7 +2383,6 @@ extern asection _bfd_elf_large_com_secti
 	  }								\
       }									\
 									\
-    _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);	\
     rel->r_info = 0;							\
     rel->r_addend = 0;							\
     continue;								\
Index: elf32-arm.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-arm.c,v
retrieving revision 1.245
diff -u -p -r1.245 elf32-arm.c
--- elf32-arm.c	11 Oct 2010 07:38:53 -0000	1.245
+++ elf32-arm.c	22 Oct 2010 02:32:50 -0000
@@ -9033,15 +9033,8 @@ elf32_arm_relocate_section (bfd *       
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	{
Index: libbfd-in.h
===================================================================
RCS file: /cvs/src/src/bfd/libbfd-in.h,v
retrieving revision 1.84
diff -u -p -r1.84 libbfd-in.h
--- libbfd-in.h	18 Aug 2010 12:24:07 -0000	1.84
+++ libbfd-in.h	22 Oct 2010 02:32:50 -0000
@@ -628,7 +628,7 @@ extern bfd_reloc_status_type _bfd_reloca
 
 /* Clear a given location using a given howto.  */
 extern void _bfd_clear_contents (reloc_howto_type *howto, bfd *input_bfd,
-				 bfd_byte *location);
+				 asection *input_section, bfd_byte *location);
 
 /* Link stabs in sections in the first pass.  */
 
Index: libbfd.h
===================================================================
RCS file: /cvs/src/src/bfd/libbfd.h,v
retrieving revision 1.240
diff -u -p -r1.240 libbfd.h
--- libbfd.h	8 Oct 2010 22:34:37 -0000	1.240
+++ libbfd.h	22 Oct 2010 02:32:50 -0000
@@ -633,7 +633,7 @@ extern bfd_reloc_status_type _bfd_reloca
 
 /* Clear a given location using a given howto.  */
 extern void _bfd_clear_contents (reloc_howto_type *howto, bfd *input_bfd,
-				 bfd_byte *location);
+				 asection *input_section, bfd_byte *location);
 
 /* Link stabs in sections in the first pass.  */
 
Index: reloc.c
===================================================================
RCS file: /cvs/src/src/bfd/reloc.c,v
retrieving revision 1.206
diff -u -p -r1.206 reloc.c
--- reloc.c	8 Oct 2010 22:34:37 -0000	1.206
+++ reloc.c	22 Oct 2010 02:32:50 -0000
@@ -1544,14 +1544,15 @@ _bfd_relocate_contents (reloc_howto_type
   return flag;
 }
 
-/* Clear a given location using a given howto, by applying a relocation value
-   of zero and discarding any in-place addend.  This is used for fixed-up
+/* Clear a given location using a given howto, by applying a fixed relocation
+   value and discarding any in-place addend.  This is used for fixed-up
    relocations against discarded symbols, to make ignorable debug or unwind
    information more obvious.  */
 
 void
 _bfd_clear_contents (reloc_howto_type *howto,
 		     bfd *input_bfd,
+		     asection *input_section,
 		     bfd_byte *location)
 {
   int size;
@@ -1585,6 +1586,13 @@ _bfd_clear_contents (reloc_howto_type *h
   /* Zero out the unwanted bits of X.  */
   x &= ~howto->dst_mask;
 
+  /* For a range list, use 1 instead of 0 as placeholder.  0
+     terminates the list.  */
+  if (strcmp (bfd_get_section_name (input_bfd, input_section),
+	      ".debug_ranges") == 0
+      && (howto->dst_mask & 1) != 0)
+    x |= 1;
+
   /* Put the relocated value back in the object file.  */
   switch (size)
     {
@@ -5756,7 +5764,8 @@ bfd_generic_get_relocated_section_conten
 			 "unused", FALSE, 0, 0, FALSE);
 
 	      p = data + (*parent)->address * bfd_octets_per_byte (input_bfd);
-	      _bfd_clear_contents ((*parent)->howto, input_bfd, p);
+	      _bfd_clear_contents ((*parent)->howto, input_bfd, input_section,
+				   p);
 	      (*parent)->sym_ptr_ptr = bfd_abs_section.symbol_ptr_ptr;
 	      (*parent)->addend = 0;
 	      (*parent)->howto = &none_howto;

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: gc-sections and DWARF ranges
  2010-10-22  2:35   ` Daniel Jacobowitz
@ 2010-10-22  4:16     ` Alan Modra
  2010-10-22 14:27       ` Daniel Jacobowitz
  0 siblings, 1 reply; 11+ messages in thread
From: Alan Modra @ 2010-10-22  4:16 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: binutils

On Thu, Oct 21, 2010 at 10:35:38PM -0400, Daniel Jacobowitz wrote:
> What's your opinion of a flat-out hack then?

What does one more hack matter?  :-)

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: gc-sections and DWARF ranges
  2010-10-22  4:16     ` Alan Modra
@ 2010-10-22 14:27       ` Daniel Jacobowitz
  2010-10-25 15:56         ` Daniel Jacobowitz
  0 siblings, 1 reply; 11+ messages in thread
From: Daniel Jacobowitz @ 2010-10-22 14:27 UTC (permalink / raw)
  To: binutils

On Fri, Oct 22, 2010 at 02:45:49PM +1030, Alan Modra wrote:
> On Thu, Oct 21, 2010 at 10:35:38PM -0400, Daniel Jacobowitz wrote:
> > What's your opinion of a flat-out hack then?
> 
> What does one more hack matter?  :-)

Here's the patch, then.  It builds for all targets and tests OK on
x86_64.  I'm going to run some more tests before I commit it.

-- 
Daniel Jacobowitz
CodeSourcery

2010-10-22  Daniel Jacobowitz  <dan@codesourcery.com>

	* elf-bfd.h (RELOC_AGAINST_DISCARDED_SECTION): Always call
	_bfd_clear_contents.  Pass it the input section.
	* libbfd-in.h (_bfd_clear_contents): Add input_section argument.
	* libbfd.h: Regenerate.
	* reloc.c (_bfd_clear_contents): Take input_section argument.
	Use non-zero for .debug_ranges.
	(bfd_generic_get_relocated_section_conten): Update _bfd_clear_contents
	call.

	* elf32-arm.c (elf32_arm_relocate_section): Use
	RELOC_AGAINST_DISCARDED_SECTION.
	* elf-m10200.c (mn10200_elf_relocate_section): Likewise.
	* elf-m10300.c (mn10300_elf_relocate_section): Likewise.
	* elf32-arm.c (elf32_arm_relocate_section): Likewise.
	* elf32-avr.c (elf32_avr_relocate_section): Likewise.
	* elf32-bfin.c (bfin_relocate_section): Likewise.
	(bfinfdpic_relocate_section): Likewise.
	* elf32-cr16.c (elf32_cr16_relocate_section): Likewise.
	* elf32-cr16c.c (elf32_cr16c_relocate_section): Likewise.
	* elf32-cris.c (cris_elf_relocate_section): Likewise.
	* elf32-crx.c (elf32_crx_relocate_section): Likewise.
	* elf32-d10v.c (elf32_d10v_relocate_section): Likewise.
	* elf32-fr30.c (fr30_elf_relocate_section): Likewise.
	* elf32-frv.c (elf32_frv_relocate_section): Likewise.
	* elf32-h8300.c (elf32_h8_relocate_section): Likewise.
	* elf32-hppa.c (elf32_hppa_relocate_section): Likewise.
	* elf32-i370.c (i370_elf_relocate_section): Likewise.
	* elf32-i860.c (elf32_i860_relocate_section): Likewise.
	* elf32-ip2k.c (ip2k_elf_relocate_section): Likewise.
	* elf32-iq2000.c (iq2000_elf_relocate_section): Likewise.
	* elf32-lm32.c (lm32_elf_relocate_section): Likewise.
	* elf32-m32c.c (m32c_elf_relocate_section): Likewise.
	* elf32-m32r.c (m32r_elf_relocate_section): Likewise.
	* elf32-m68hc1x.c (elf32_m68hc11_relocate_section): Likewise.
	* elf32-m68k.c (elf_m68k_relocate_section): Likewise.
	* elf32-mcore.c (mcore_elf_relocate_section): Likewise.
	* elf32-mep.c (mep_elf_relocate_section): Likewise.
	* elf32-moxie.c (moxie_elf_relocate_section): Likewise.
	* elf32-msp430.c (elf32_msp430_relocate_section): Likewise.
	* elf32-mt.c (mt_elf_relocate_section): Likewise.
	* elf32-openrisc.c (openrisc_elf_relocate_section): Likewise.
	* elf32-ppc.c (ppc_elf_relocate_section): Likewise.
	* elf32-rx.c (rx_elf_relocate_section): Likewise.
	* elf32-s390.c (elf_s390_relocate_section): Likewise.
	* elf32-score.c (s3_bfd_score_elf_relocate_section): Likewise.
	* elf32-score7.c (s7_bfd_score_elf_relocate_section): Likewise.
	* elf32-sh.c (sh_elf_relocate_section): Likewise.
	* elf32-spu.c (spu_elf_relocate_section): Likewise.
	* elf32-tic6x.c (elf32_tic6x_relocate_section): Likewise.
	* elf32-v850.c (v850_elf_relocate_section): Likewise.
	* elf32-vax.c (elf_vax_relocate_section): Likewise.
	* elf32-xc16x.c (elf32_xc16x_relocate_section): Likewise.
	* elf32-xstormy16.c (xstormy16_elf_relocate_section): Likewise.
	* elf32-xtensa.c (elf_xtensa_relocate_section): Likewise.
	* elf64-alpha.c (elf64_alpha_relocate_section_r): Likewise.
	(elf64_alpha_relocate_section): Likewise.
	* elf64-hppa.c (elf64_hppa_relocate_section): Likewise.
	* elf64-mmix.c (mmix_elf_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.
	* elfxx-ia64.c (elfNN_ia64_relocate_section): Likewise.
	* elfxx-mips.c (_bfd_mips_elf_relocate_section): Likewise.
	* elfxx-sparc.c (_bfd_sparc_elf_relocate_section): Likewise.

	ld/testsuite/
	* ld-discard/zero-range.d, ld-discard/zero-range.s: New files.

Index: bfd/elf-bfd.h
===================================================================
RCS file: /cvs/src/src/bfd/elf-bfd.h,v
retrieving revision 1.311
diff -u -p -r1.311 elf-bfd.h
--- bfd/elf-bfd.h	21 Oct 2010 12:29:01 -0000	1.311
+++ bfd/elf-bfd.h	22 Oct 2010 14:20:22 -0000
@@ -2355,6 +2355,9 @@ extern asection _bfd_elf_large_com_secti
 #define RELOC_AGAINST_DISCARDED_SECTION(info, input_bfd, input_section,	\
 					rel, relend, howto, contents)	\
   {									\
+    _bfd_clear_contents (howto, input_bfd, input_section,		\
+			 contents + rel->r_offset);			\
+									\
     if (info->relocatable						\
 	&& (input_section->flags & SEC_DEBUGGING))			\
       {									\
@@ -2380,7 +2383,6 @@ extern asection _bfd_elf_large_com_secti
 	  }								\
       }									\
 									\
-    _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);	\
     rel->r_info = 0;							\
     rel->r_addend = 0;							\
     continue;								\
Index: bfd/elf-m10200.c
===================================================================
RCS file: /cvs/src/src/bfd/elf-m10200.c,v
retrieving revision 1.36
diff -u -p -r1.36 elf-m10200.c
--- bfd/elf-m10200.c	27 Jun 2010 04:07:51 -0000	1.36
+++ bfd/elf-m10200.c	22 Oct 2010 14:20:22 -0000
@@ -402,15 +402,8 @@ mn10200_elf_relocate_section (output_bfd
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf-m10300.c
===================================================================
RCS file: /cvs/src/src/bfd/elf-m10300.c,v
retrieving revision 1.105
diff -u -p -r1.105 elf-m10300.c
--- bfd/elf-m10300.c	25 Aug 2010 14:53:39 -0000	1.105
+++ bfd/elf-m10300.c	22 Oct 2010 14:20:22 -0000
@@ -1510,15 +1510,8 @@ mn10300_elf_relocate_section (bfd *outpu
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-arm.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-arm.c,v
retrieving revision 1.245
diff -u -p -r1.245 elf32-arm.c
--- bfd/elf32-arm.c	11 Oct 2010 07:38:53 -0000	1.245
+++ bfd/elf32-arm.c	22 Oct 2010 14:20:22 -0000
@@ -9033,15 +9033,8 @@ elf32_arm_relocate_section (bfd *       
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	{
Index: bfd/elf32-avr.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-avr.c,v
retrieving revision 1.47
diff -u -p -r1.47 elf32-avr.c
--- bfd/elf32-avr.c	25 Aug 2010 14:53:40 -0000	1.47
+++ bfd/elf32-avr.c	22 Oct 2010 14:20:22 -0000
@@ -1232,15 +1232,8 @@ elf32_avr_relocate_section (bfd *output_
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-bfin.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-bfin.c,v
retrieving revision 1.48
diff -u -p -r1.48 elf32-bfin.c
--- bfd/elf32-bfin.c	25 Aug 2010 14:53:40 -0000	1.48
+++ bfd/elf32-bfin.c	22 Oct 2010 14:20:22 -0000
@@ -1429,15 +1429,8 @@ bfin_relocate_section (bfd * output_bfd,
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
@@ -2655,15 +2648,8 @@ bfinfdpic_relocate_section (bfd * output
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-cr16.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-cr16.c,v
retrieving revision 1.15
diff -u -p -r1.15 elf32-cr16.c
--- bfd/elf32-cr16.c	27 Jun 2010 04:07:51 -0000	1.15
+++ bfd/elf32-cr16.c	22 Oct 2010 14:20:22 -0000
@@ -1432,15 +1432,8 @@ elf32_cr16_relocate_section (bfd *output
         }
 
       if (sec != NULL && elf_discarded_section (sec))
-       {
-         /* For relocs against symbols from removed linkonce sections,
-            or sections discarded by a linker script, we just want the
-            section contents zeroed.  Avoid any special processing.  */
-         _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-         rel->r_info = 0;
-         rel->r_addend = 0;
-         continue;
-       }
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
         continue;
Index: bfd/elf32-cr16c.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-cr16c.c,v
retrieving revision 1.15
diff -u -p -r1.15 elf32-cr16c.c
--- bfd/elf32-cr16c.c	27 Jun 2010 04:07:51 -0000	1.15
+++ bfd/elf32-cr16c.c	22 Oct 2010 14:20:22 -0000
@@ -724,15 +724,8 @@ elf32_cr16c_relocate_section (bfd *outpu
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	{
Index: bfd/elf32-cris.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-cris.c,v
retrieving revision 1.113
diff -u -p -r1.113 elf32-cris.c
--- bfd/elf32-cris.c	24 Sep 2010 12:14:24 -0000	1.113
+++ bfd/elf32-cris.c	22 Oct 2010 14:20:22 -0000
@@ -1181,15 +1181,8 @@ cris_elf_relocate_section (bfd *output_b
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-crx.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-crx.c,v
retrieving revision 1.15
diff -u -p -r1.15 elf32-crx.c
--- bfd/elf32-crx.c	27 Jun 2010 04:07:51 -0000	1.15
+++ bfd/elf32-crx.c	22 Oct 2010 14:20:22 -0000
@@ -874,15 +874,8 @@ elf32_crx_relocate_section (bfd *output_
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-d10v.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-d10v.c,v
retrieving revision 1.38
diff -u -p -r1.38 elf32-d10v.c
--- bfd/elf32-d10v.c	28 Sep 2007 08:43:45 -0000	1.38
+++ bfd/elf32-d10v.c	22 Oct 2010 14:20:22 -0000
@@ -464,15 +464,8 @@ elf32_d10v_relocate_section (bfd *output
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-fr30.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-fr30.c,v
retrieving revision 1.39
diff -u -p -r1.39 elf32-fr30.c
--- bfd/elf32-fr30.c	2 Sep 2009 07:18:36 -0000	1.39
+++ bfd/elf32-fr30.c	22 Oct 2010 14:20:22 -0000
@@ -578,15 +578,8 @@ fr30_elf_relocate_section (output_bfd, i
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-frv.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-frv.c,v
retrieving revision 1.70
diff -u -p -r1.70 elf32-frv.c
--- bfd/elf32-frv.c	11 Oct 2010 09:11:34 -0000	1.70
+++ bfd/elf32-frv.c	22 Oct 2010 14:20:23 -0000
@@ -2813,15 +2813,8 @@ elf32_frv_relocate_section (output_bfd, 
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-h8300.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-h8300.c,v
retrieving revision 1.57
diff -u -p -r1.57 elf32-h8300.c
--- bfd/elf32-h8300.c	27 Jun 2010 04:07:51 -0000	1.57
+++ bfd/elf32-h8300.c	22 Oct 2010 14:20:23 -0000
@@ -461,15 +461,8 @@ elf32_h8_relocate_section (bfd *output_b
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-hppa.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-hppa.c,v
retrieving revision 1.175
diff -u -p -r1.175 elf32-hppa.c
--- bfd/elf32-hppa.c	24 Sep 2010 12:14:24 -0000	1.175
+++ bfd/elf32-hppa.c	22 Oct 2010 14:20:23 -0000
@@ -3741,17 +3741,10 @@ elf32_hppa_relocate_section (bfd *output
 	}
 
       if (sym_sec != NULL && elf_discarded_section (sym_sec))
-	{
-	  /* For relocs against symbols from removed linkonce
-	     sections, or sections discarded by a linker script,
-	     we just want the section contents zeroed.  Avoid any
-	     special processing.  */
-	  _bfd_clear_contents (elf_hppa_howto_table + r_type, input_bfd,
-			       contents + rela->r_offset);
-	  rela->r_info = 0;
-	  rela->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rela, relend,
+					 elf_hppa_howto_table + r_type,
+					 contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-i370.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-i370.c,v
retrieving revision 1.66
diff -u -p -r1.66 elf32-i370.c
--- bfd/elf32-i370.c	24 Sep 2010 12:14:24 -0000	1.66
+++ bfd/elf32-i370.c	22 Oct 2010 14:20:23 -0000
@@ -1141,15 +1141,8 @@ i370_elf_relocate_section (bfd *output_b
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-i860.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-i860.c,v
retrieving revision 1.41
diff -u -p -r1.41 elf32-i860.c
--- bfd/elf32-i860.c	3 Jul 2007 14:26:41 -0000	1.41
+++ bfd/elf32-i860.c	22 Oct 2010 14:20:23 -0000
@@ -1129,15 +1129,8 @@ elf32_i860_relocate_section (bfd *output
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-ip2k.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-ip2k.c,v
retrieving revision 1.27
diff -u -p -r1.27 elf32-ip2k.c
--- bfd/elf32-ip2k.c	27 Jun 2010 04:07:51 -0000	1.27
+++ bfd/elf32-ip2k.c	22 Oct 2010 14:20:23 -0000
@@ -1437,15 +1437,8 @@ ip2k_elf_relocate_section (bfd *output_b
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-iq2000.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-iq2000.c,v
retrieving revision 1.26
diff -u -p -r1.26 elf32-iq2000.c
--- bfd/elf32-iq2000.c	30 Jul 2008 04:34:56 -0000	1.26
+++ bfd/elf32-iq2000.c	22 Oct 2010 14:20:23 -0000
@@ -634,15 +634,8 @@ iq2000_elf_relocate_section (bfd *		    
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-lm32.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-lm32.c,v
retrieving revision 1.7
diff -u -p -r1.7 elf32-lm32.c
--- bfd/elf32-lm32.c	25 Aug 2010 14:53:42 -0000	1.7
+++ bfd/elf32-lm32.c	22 Oct 2010 14:20:23 -0000
@@ -894,15 +894,8 @@ lm32_elf_relocate_section (bfd *output_b
         }
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
         {
Index: bfd/elf32-m32c.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-m32c.c,v
retrieving revision 1.22
diff -u -p -r1.22 elf32-m32c.c
--- bfd/elf32-m32c.c	4 Aug 2010 03:42:45 -0000	1.22
+++ bfd/elf32-m32c.c	22 Oct 2010 14:20:23 -0000
@@ -435,15 +435,8 @@ m32c_elf_relocate_section
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	{
Index: bfd/elf32-m32r.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-m32r.c,v
retrieving revision 1.100
diff -u -p -r1.100 elf32-m32r.c
--- bfd/elf32-m32r.c	4 Oct 2010 14:13:09 -0000	1.100
+++ bfd/elf32-m32r.c	22 Oct 2010 14:20:23 -0000
@@ -2626,15 +2626,8 @@ m32r_elf_relocate_section (bfd *output_b
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable && !use_rel)
 	{
Index: bfd/elf32-m68hc1x.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-m68hc1x.c,v
retrieving revision 1.38
diff -u -p -r1.38 elf32-m68hc1x.c
--- bfd/elf32-m68hc1x.c	27 Jun 2010 04:07:51 -0000	1.38
+++ bfd/elf32-m68hc1x.c	22 Oct 2010 14:20:23 -0000
@@ -971,15 +971,8 @@ elf32_m68hc11_relocate_section (bfd *out
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	{
Index: bfd/elf32-m68k.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-m68k.c,v
retrieving revision 1.123
diff -u -p -r1.123 elf32-m68k.c
--- bfd/elf32-m68k.c	24 Sep 2010 12:14:24 -0000	1.123
+++ bfd/elf32-m68k.c	22 Oct 2010 14:20:23 -0000
@@ -3716,15 +3716,8 @@ elf_m68k_relocate_section (output_bfd, i
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-mcore.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-mcore.c,v
retrieving revision 1.52
diff -u -p -r1.52 elf32-mcore.c
--- bfd/elf32-mcore.c	28 Sep 2007 08:43:45 -0000	1.52
+++ bfd/elf32-mcore.c	22 Oct 2010 14:20:23 -0000
@@ -467,15 +467,8 @@ mcore_elf_relocate_section (bfd * output
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-mep.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-mep.c,v
retrieving revision 1.13
diff -u -p -r1.13 elf32-mep.c
--- bfd/elf32-mep.c	2 Sep 2009 07:18:36 -0000	1.13
+++ bfd/elf32-mep.c	22 Oct 2010 14:20:23 -0000
@@ -500,15 +500,8 @@ mep_elf_relocate_section
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-moxie.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-moxie.c,v
retrieving revision 1.3
diff -u -p -r1.3 elf32-moxie.c
--- bfd/elf32-moxie.c	27 Jun 2010 04:07:51 -0000	1.3
+++ bfd/elf32-moxie.c	22 Oct 2010 14:20:23 -0000
@@ -251,15 +251,8 @@ moxie_elf_relocate_section (bfd *output_
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-msp430.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-msp430.c,v
retrieving revision 1.21
diff -u -p -r1.21 elf32-msp430.c
--- bfd/elf32-msp430.c	27 Jun 2010 04:07:51 -0000	1.21
+++ bfd/elf32-msp430.c	22 Oct 2010 14:20:23 -0000
@@ -455,15 +455,8 @@ elf32_msp430_relocate_section (bfd * out
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-mt.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-mt.c,v
retrieving revision 1.12
diff -u -p -r1.12 elf32-mt.c
--- bfd/elf32-mt.c	30 Jul 2008 04:34:56 -0000	1.12
+++ bfd/elf32-mt.c	22 Oct 2010 14:20:23 -0000
@@ -355,15 +355,8 @@ mt_elf_relocate_section
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-openrisc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-openrisc.c,v
retrieving revision 1.30
diff -u -p -r1.30 elf32-openrisc.c
--- bfd/elf32-openrisc.c	28 Sep 2007 08:43:45 -0000	1.30
+++ bfd/elf32-openrisc.c	22 Oct 2010 14:20:23 -0000
@@ -374,15 +374,8 @@ openrisc_elf_relocate_section (bfd *outp
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-ppc.c,v
retrieving revision 1.289
diff -u -p -r1.289 elf32-ppc.c
--- bfd/elf32-ppc.c	4 Oct 2010 14:13:09 -0000	1.289
+++ bfd/elf32-ppc.c	22 Oct 2010 14:20:23 -0000
@@ -6817,10 +6817,8 @@ ppc_elf_relocate_section (bfd *output_bf
 	  howto = NULL;
 	  if (r_type < R_PPC_max)
 	    howto = ppc_elf_howto_table[r_type];
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
+	  RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					   rel, relend, howto, contents);
 	}
 
       if (info->relocatable)
Index: bfd/elf32-rx.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-rx.c,v
retrieving revision 1.4
diff -u -p -r1.4 elf32-rx.c
--- bfd/elf32-rx.c	8 Oct 2010 14:00:47 -0000	1.4
+++ bfd/elf32-rx.c	22 Oct 2010 14:20:23 -0000
@@ -502,15 +502,8 @@ rx_elf_relocate_section
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	{
Index: bfd/elf32-s390.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-s390.c,v
retrieving revision 1.106
diff -u -p -r1.106 elf32-s390.c
--- bfd/elf32-s390.c	25 Aug 2010 14:53:43 -0000	1.106
+++ bfd/elf32-s390.c	22 Oct 2010 14:20:23 -0000
@@ -2292,15 +2292,8 @@ elf_s390_relocate_section (output_bfd, i
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-score.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-score.c,v
retrieving revision 1.20
diff -u -p -r1.20 elf32-score.c
--- bfd/elf32-score.c	24 Sep 2010 12:14:24 -0000	1.20
+++ bfd/elf32-score.c	22 Oct 2010 14:20:23 -0000
@@ -2675,15 +2675,8 @@ s3_bfd_score_elf_relocate_section (bfd *
         }
 
       if (sec != NULL && elf_discarded_section (sec))
-        {
-          /* For relocs against symbols from removed linkonce sections,
-             or sections discarded by a linker script, we just want the
-             section contents zeroed.  Avoid any special processing.  */
-          _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-          rel->r_info = 0;
-          rel->r_addend = 0;
-          continue;
-        }
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
         {
Index: bfd/elf32-score7.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-score7.c,v
retrieving revision 1.7
diff -u -p -r1.7 elf32-score7.c
--- bfd/elf32-score7.c	24 Sep 2010 12:14:24 -0000	1.7
+++ bfd/elf32-score7.c	22 Oct 2010 14:20:23 -0000
@@ -2447,15 +2447,8 @@ s7_bfd_score_elf_relocate_section (bfd *
         }
 
       if (sec != NULL && elf_discarded_section (sec))
-        {
-          /* For relocs against symbols from removed linkonce sections,
-             or sections discarded by a linker script, we just want the
-             section contents zeroed.  Avoid any special processing.  */
-          _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-          rel->r_info = 0;
-          rel->r_addend = 0;
-          continue;
-        }
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
         {
Index: bfd/elf32-sh.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-sh.c,v
retrieving revision 1.169
diff -u -p -r1.169 elf32-sh.c
--- bfd/elf32-sh.c	24 Sep 2010 12:14:24 -0000	1.169
+++ bfd/elf32-sh.c	22 Oct 2010 14:20:23 -0000
@@ -4246,15 +4246,8 @@ sh_elf_relocate_section (bfd *output_bfd
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-spu.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-spu.c,v
retrieving revision 1.99
diff -u -p -r1.99 elf32-spu.c
--- bfd/elf32-spu.c	4 Oct 2010 14:13:09 -0000	1.99
+++ bfd/elf32-spu.c	22 Oct 2010 14:20:23 -0000
@@ -4896,15 +4896,8 @@ spu_elf_relocate_section (bfd *output_bf
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-tic6x.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-tic6x.c,v
retrieving revision 1.7
diff -u -p -r1.7 elf32-tic6x.c
--- bfd/elf32-tic6x.c	21 Oct 2010 21:16:50 -0000	1.7
+++ bfd/elf32-tic6x.c	22 Oct 2010 14:20:23 -0000
@@ -1467,15 +1467,8 @@ elf32_tic6x_relocate_section (bfd *outpu
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	{
Index: bfd/elf32-v850.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-v850.c,v
retrieving revision 1.79
diff -u -p -r1.79 elf32-v850.c
--- bfd/elf32-v850.c	23 Jul 2010 14:52:46 -0000	1.79
+++ bfd/elf32-v850.c	22 Oct 2010 14:20:24 -0000
@@ -2094,15 +2094,8 @@ v850_elf_relocate_section (bfd *output_b
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-vax.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-vax.c,v
retrieving revision 1.62
diff -u -p -r1.62 elf32-vax.c
--- bfd/elf32-vax.c	24 Sep 2010 12:14:24 -0000	1.62
+++ bfd/elf32-vax.c	22 Oct 2010 14:20:24 -0000
@@ -1453,15 +1453,8 @@ elf_vax_relocate_section (bfd *output_bf
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-xc16x.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-xc16x.c,v
retrieving revision 1.8
diff -u -p -r1.8 elf32-xc16x.c
--- bfd/elf32-xc16x.c	27 Jun 2010 04:07:53 -0000	1.8
+++ bfd/elf32-xc16x.c	22 Oct 2010 14:20:24 -0000
@@ -385,13 +385,11 @@ elf32_xc16x_relocate_section (bfd *outpu
 	{
 	  /* For relocs against symbols from removed linkonce sections,
 	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
+	     section contents cleared.  Avoid any special processing.  */
 	  reloc_howto_type *howto;
 	  howto = xc16x_reloc_type_lookup (input_bfd, r_type);
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
+	  RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					   rel, relend, howto, contents);
 	}
 
       if (info->relocatable)
Index: bfd/elf32-xstormy16.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-xstormy16.c,v
retrieving revision 1.41
diff -u -p -r1.41 elf32-xstormy16.c
--- bfd/elf32-xstormy16.c	26 Sep 2007 13:45:32 -0000	1.41
+++ bfd/elf32-xstormy16.c	22 Oct 2010 14:20:24 -0000
@@ -832,15 +832,8 @@ xstormy16_elf_relocate_section (bfd *   
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf32-xtensa.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-xtensa.c,v
retrieving revision 1.127
diff -u -p -r1.127 elf32-xtensa.c
--- bfd/elf32-xtensa.c	8 Oct 2010 14:00:47 -0000	1.127
+++ bfd/elf32-xtensa.c	22 Oct 2010 14:20:24 -0000
@@ -2660,15 +2660,8 @@ elf_xtensa_relocate_section (bfd *output
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	{
Index: bfd/elf64-alpha.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-alpha.c,v
retrieving revision 1.173
diff -u -p -r1.173 elf64-alpha.c
--- bfd/elf64-alpha.c	4 Oct 2010 14:13:09 -0000	1.173
+++ bfd/elf64-alpha.c	22 Oct 2010 14:20:24 -0000
@@ -4025,16 +4025,10 @@ elf64_alpha_relocate_section_r (bfd *out
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  */
-	  _bfd_clear_contents (elf64_alpha_howto_table + r_type,
-			       input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend,
+					 elf64_alpha_howto_table + r_type,
+					 contents);
 
       if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
 	rel->r_addend += sec->output_offset;
@@ -4240,15 +4234,8 @@ elf64_alpha_relocate_section (bfd *outpu
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       addend = rel->r_addend;
       value += addend;
Index: bfd/elf64-hppa.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-hppa.c,v
retrieving revision 1.100
diff -u -p -r1.100 elf64-hppa.c
--- bfd/elf64-hppa.c	4 Oct 2010 14:13:09 -0000	1.100
+++ bfd/elf64-hppa.c	22 Oct 2010 14:20:24 -0000
@@ -3944,15 +3944,8 @@ elf64_hppa_relocate_section (bfd *output
 	}
 
       if (sym_sec != NULL && elf_discarded_section (sym_sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf64-mmix.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-mmix.c,v
retrieving revision 1.62
diff -u -p -r1.62 elf64-mmix.c
--- bfd/elf64-mmix.c	27 Jun 2010 04:07:53 -0000	1.62
+++ bfd/elf64-mmix.c	22 Oct 2010 14:20:24 -0000
@@ -1408,15 +1408,8 @@ mmix_elf_relocate_section (output_bfd, i
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	{
Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.338
diff -u -p -r1.338 elf64-ppc.c
--- bfd/elf64-ppc.c	4 Oct 2010 14:13:09 -0000	1.338
+++ bfd/elf64-ppc.c	22 Oct 2010 14:20:24 -0000
@@ -11624,16 +11624,10 @@ ppc64_elf_relocate_section (bfd *output_
       h = (struct ppc_link_hash_entry *) h_elf;
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (ppc64_elf_howto_table[r_type], input_bfd,
-			       contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend,
+					 ppc64_elf_howto_table[r_type],
+					 contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf64-s390.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-s390.c,v
retrieving revision 1.106
diff -u -p -r1.106 elf64-s390.c
--- bfd/elf64-s390.c	25 Aug 2010 14:53:45 -0000	1.106
+++ bfd/elf64-s390.c	22 Oct 2010 14:20:24 -0000
@@ -2280,15 +2280,8 @@ elf_s390_relocate_section (bfd *output_b
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elf64-sh64.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-sh64.c,v
retrieving revision 1.85
diff -u -p -r1.85 elf64-sh64.c
--- bfd/elf64-sh64.c	4 Feb 2010 09:16:41 -0000	1.85
+++ bfd/elf64-sh64.c	22 Oct 2010 14:20:24 -0000
@@ -1658,15 +1658,8 @@ sh_elf64_relocate_section (bfd *output_b
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elfxx-ia64.c
===================================================================
RCS file: /cvs/src/src/bfd/elfxx-ia64.c,v
retrieving revision 1.227
diff -u -p -r1.227 elfxx-ia64.c
--- bfd/elfxx-ia64.c	4 Oct 2010 14:13:09 -0000	1.227
+++ bfd/elfxx-ia64.c	22 Oct 2010 14:20:24 -0000
@@ -4662,16 +4662,9 @@ elfNN_ia64_relocate_section (bfd *output
 	    continue;
 	}
 
-      /* For relocs against symbols from removed linkonce sections,
-	 or sections discarded by a linker script, we just want the
-	 section contents zeroed.  Avoid any special processing.  */
       if (sym_sec != NULL && elf_discarded_section (sym_sec))
-	{
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/elfxx-mips.c
===================================================================
RCS file: /cvs/src/src/bfd/elfxx-mips.c,v
retrieving revision 1.276
diff -u -p -r1.276 elfxx-mips.c
--- bfd/elfxx-mips.c	4 Oct 2010 14:13:09 -0000	1.276
+++ bfd/elfxx-mips.c	22 Oct 2010 14:20:25 -0000
@@ -9000,15 +9000,8 @@ _bfd_mips_elf_relocate_section (bfd *out
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce sections,
-	     or sections discarded by a linker script, we just want the
-	     section contents zeroed.  Avoid any special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (r_type == R_MIPS_64 && ! NEWABI_P (input_bfd))
 	{
Index: bfd/elfxx-sparc.c
===================================================================
RCS file: /cvs/src/src/bfd/elfxx-sparc.c,v
retrieving revision 1.56
diff -u -p -r1.56 elfxx-sparc.c
--- bfd/elfxx-sparc.c	22 Oct 2010 12:08:28 -0000	1.56
+++ bfd/elfxx-sparc.c	22 Oct 2010 14:20:25 -0000
@@ -2964,16 +2964,8 @@ _bfd_sparc_elf_relocate_section (bfd *ou
 	}
 
       if (sec != NULL && elf_discarded_section (sec))
-	{
-	  /* For relocs against symbols from removed linkonce
-	     sections, or sections discarded by a linker script, we
-	     just want the section contents zeroed.  Avoid any
-	     special processing.  */
-	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
-	  rel->r_info = 0;
-	  rel->r_addend = 0;
-	  continue;
-	}
+	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+					 rel, relend, howto, contents);
 
       if (info->relocatable)
 	continue;
Index: bfd/libbfd-in.h
===================================================================
RCS file: /cvs/src/src/bfd/libbfd-in.h,v
retrieving revision 1.84
diff -u -p -r1.84 libbfd-in.h
--- bfd/libbfd-in.h	18 Aug 2010 12:24:07 -0000	1.84
+++ bfd/libbfd-in.h	22 Oct 2010 14:20:25 -0000
@@ -628,7 +628,7 @@ extern bfd_reloc_status_type _bfd_reloca
 
 /* Clear a given location using a given howto.  */
 extern void _bfd_clear_contents (reloc_howto_type *howto, bfd *input_bfd,
-				 bfd_byte *location);
+				 asection *input_section, bfd_byte *location);
 
 /* Link stabs in sections in the first pass.  */
 
Index: bfd/libbfd.h
===================================================================
RCS file: /cvs/src/src/bfd/libbfd.h,v
retrieving revision 1.240
diff -u -p -r1.240 libbfd.h
--- bfd/libbfd.h	8 Oct 2010 22:34:37 -0000	1.240
+++ bfd/libbfd.h	22 Oct 2010 14:20:25 -0000
@@ -633,7 +633,7 @@ extern bfd_reloc_status_type _bfd_reloca
 
 /* Clear a given location using a given howto.  */
 extern void _bfd_clear_contents (reloc_howto_type *howto, bfd *input_bfd,
-				 bfd_byte *location);
+				 asection *input_section, bfd_byte *location);
 
 /* Link stabs in sections in the first pass.  */
 
Index: bfd/reloc.c
===================================================================
RCS file: /cvs/src/src/bfd/reloc.c,v
retrieving revision 1.206
diff -u -p -r1.206 reloc.c
--- bfd/reloc.c	8 Oct 2010 22:34:37 -0000	1.206
+++ bfd/reloc.c	22 Oct 2010 14:20:25 -0000
@@ -1544,14 +1544,15 @@ _bfd_relocate_contents (reloc_howto_type
   return flag;
 }
 
-/* Clear a given location using a given howto, by applying a relocation value
-   of zero and discarding any in-place addend.  This is used for fixed-up
+/* Clear a given location using a given howto, by applying a fixed relocation
+   value and discarding any in-place addend.  This is used for fixed-up
    relocations against discarded symbols, to make ignorable debug or unwind
    information more obvious.  */
 
 void
 _bfd_clear_contents (reloc_howto_type *howto,
 		     bfd *input_bfd,
+		     asection *input_section,
 		     bfd_byte *location)
 {
   int size;
@@ -1585,6 +1586,13 @@ _bfd_clear_contents (reloc_howto_type *h
   /* Zero out the unwanted bits of X.  */
   x &= ~howto->dst_mask;
 
+  /* For a range list, use 1 instead of 0 as placeholder.  0
+     would terminate the list, hiding any later entries.  */
+  if (strcmp (bfd_get_section_name (input_bfd, input_section),
+	      ".debug_ranges") == 0
+      && (howto->dst_mask & 1) != 0)
+    x |= 1;
+
   /* Put the relocated value back in the object file.  */
   switch (size)
     {
@@ -5756,7 +5764,8 @@ bfd_generic_get_relocated_section_conten
 			 "unused", FALSE, 0, 0, FALSE);
 
 	      p = data + (*parent)->address * bfd_octets_per_byte (input_bfd);
-	      _bfd_clear_contents ((*parent)->howto, input_bfd, p);
+	      _bfd_clear_contents ((*parent)->howto, input_bfd, input_section,
+				   p);
 	      (*parent)->sym_ptr_ptr = bfd_abs_section.symbol_ptr_ptr;
 	      (*parent)->addend = 0;
 	      (*parent)->howto = &none_howto;
Index: ld/testsuite/ld-discard/zero-range.d
===================================================================
RCS file: ld/testsuite/ld-discard/zero-range.d
diff -N ld/testsuite/ld-discard/zero-range.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-discard/zero-range.d	22 Oct 2010 14:20:25 -0000
@@ -0,0 +1,8 @@
+#source: zero-range.s
+#ld: -T discard.ld
+#objdump: -s -j .debug_ranges
+
+.*:     file format .*elf.*
+
+Contents of section .debug_ranges:
+ 0000 (01)?000000(01)? (01)?000000(01)? 00000000 00000000 .*
Index: ld/testsuite/ld-discard/zero-range.s
===================================================================
RCS file: ld/testsuite/ld-discard/zero-range.s
diff -N ld/testsuite/ld-discard/zero-range.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-discard/zero-range.s	22 Oct 2010 14:20:25 -0000
@@ -0,0 +1,13 @@
+	.text
+	.globl _start
+_start:
+
+	.section	.debug_ranges
+	.long	.Ltext
+	.long	.Ltext + 2
+	.long	0
+	.long	0
+
+	.section	.text.exit,"ax"
+.Ltext:
+	.long	0

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: gc-sections and DWARF ranges
  2010-10-21 21:41 gc-sections and DWARF ranges Daniel Jacobowitz
  2010-10-21 23:34 ` Alan Modra
@ 2010-10-22 15:40 ` Richard Henderson
  2010-10-22 17:51   ` Cary Coutant
  2010-10-22 20:12   ` Daniel Jacobowitz
  2010-10-22 18:23 ` Cary Coutant
  2 siblings, 2 replies; 11+ messages in thread
From: Richard Henderson @ 2010-10-22 15:40 UTC (permalink / raw)
  To: binutils

On 10/21/2010 02:41 PM, Daniel Jacobowitz wrote:
> Is there any provision in GNU ld for this that I'm not seeing?  We
> ought to remove discarded entries with knowledge of the .debug_ranges
> output; I don't see how we can get this right otherwise.

Isn't this ideally handled with section groups?


r~

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: gc-sections and DWARF ranges
  2010-10-22 15:40 ` Richard Henderson
@ 2010-10-22 17:51   ` Cary Coutant
  2010-10-22 20:12   ` Daniel Jacobowitz
  1 sibling, 0 replies; 11+ messages in thread
From: Cary Coutant @ 2010-10-22 17:51 UTC (permalink / raw)
  To: Richard Henderson; +Cc: binutils

>> Is there any provision in GNU ld for this that I'm not seeing?  We
>> ought to remove discarded entries with knowledge of the .debug_ranges
>> output; I don't see how we can get this right otherwise.
>
> Isn't this ideally handled with section groups?

Yes, it is, but I think gcc is a long way from being able to emit
debug info as part of a comdat group. I think other binutils tools
(readelf, objdump) may also need some work in order to handle
relocatable objects with several sets of debug sections.

-cary

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: gc-sections and DWARF ranges
  2010-10-21 21:41 gc-sections and DWARF ranges Daniel Jacobowitz
  2010-10-21 23:34 ` Alan Modra
  2010-10-22 15:40 ` Richard Henderson
@ 2010-10-22 18:23 ` Cary Coutant
  2010-10-22 20:09   ` Daniel Jacobowitz
  2 siblings, 1 reply; 11+ messages in thread
From: Cary Coutant @ 2010-10-22 18:23 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: binutils

> I found a test today where GDB fails to find symbol info.  It's not
> GDB's fault, though: there's an input .o file which has eleven entries
> in .debug_ranges, and then there's only nine by the end of the link.
> The tenth was for a GC'd section.  The eleventh, by bad luck, happens
> to be main.
>
> Cary fixed a specific case of this problem in GCC by emitting fewer ranges:
>
>  http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42454
>
> That doesn't solve the general problem if there's actual garbage
> collection.
>
> Is there any provision in GNU ld for this that I'm not seeing?  We
> ought to remove discarded entries with knowledge of the .debug_ranges
> output; I don't see how we can get this right otherwise.
>
> I can make a good argument that every debug section with references to
> the discarded section must have special processing, or we are
> generating broken debug output - GDB's workaround for functions at
> address 0 is another case.  That one can be solved by use of section
> groups, but the compile unit's .debug_ranges has to be a single entity.

With gold, we don't observe the problem because it takes a pair of
zeroes to terminate the list, and gold still applies the addend when
applying a relocation that refers to a discarded symbol. In the
.debug_ranges section, for a function foo, we'll see relocations for
foo and foo+n. Where gnu ld relocates this to a (0,0) pair, gold
produces a (0,n) pair. Arguably, this isn't an ideal thing to do
either, but at least gdb doesn't get confused by the (0,n) entry.

As Richard said, ideally we'd never see a relocation to a discarded
section, as all those references would be in the same comdat group.

-cary

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: gc-sections and DWARF ranges
  2010-10-22 18:23 ` Cary Coutant
@ 2010-10-22 20:09   ` Daniel Jacobowitz
  0 siblings, 0 replies; 11+ messages in thread
From: Daniel Jacobowitz @ 2010-10-22 20:09 UTC (permalink / raw)
  To: Cary Coutant; +Cc: binutils

On Fri, Oct 22, 2010 at 11:22:57AM -0700, Cary Coutant wrote:
> With gold, we don't observe the problem because it takes a pair of
> zeroes to terminate the list, and gold still applies the addend when
> applying a relocation that refers to a discarded symbol. In the
> .debug_ranges section, for a function foo, we'll see relocations for
> foo and foo+n. Where gnu ld relocates this to a (0,0) pair, gold
> produces a (0,n) pair. Arguably, this isn't an ideal thing to do
> either, but at least gdb doesn't get confused by the (0,n) entry.

GNU ld used to do this (pre-2006).  We deliberately switched over to
the 0,0 version.  0,n is fine for bogus .debug_ranges lists, but bad
for architectures with low valid addresses; I routinely used to get
discarded functions from 0x0 to 0x14000 when valid code started around
0x100.

-- 
Daniel Jacobowitz
CodeSourcery

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: gc-sections and DWARF ranges
  2010-10-22 15:40 ` Richard Henderson
  2010-10-22 17:51   ` Cary Coutant
@ 2010-10-22 20:12   ` Daniel Jacobowitz
  1 sibling, 0 replies; 11+ messages in thread
From: Daniel Jacobowitz @ 2010-10-22 20:12 UTC (permalink / raw)
  To: Richard Henderson; +Cc: binutils

On Fri, Oct 22, 2010 at 08:40:22AM -0700, Richard Henderson wrote:
> On 10/21/2010 02:41 PM, Daniel Jacobowitz wrote:
> > Is there any provision in GNU ld for this that I'm not seeing?  We
> > ought to remove discarded entries with knowledge of the .debug_ranges
> > output; I don't see how we can get this right otherwise.
> 
> Isn't this ideally handled with section groups?

Yes.  You'd have to generate a separate DW_TAG_compile_unit to go
along with each function; GDB gets confused when you do that (because
it thinks you have multiple source files with the same name) and a
bunch of tests fail.  But it's basically the right strategy.

-- 
Daniel Jacobowitz
CodeSourcery

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: gc-sections and DWARF ranges
  2010-10-22 14:27       ` Daniel Jacobowitz
@ 2010-10-25 15:56         ` Daniel Jacobowitz
  0 siblings, 0 replies; 11+ messages in thread
From: Daniel Jacobowitz @ 2010-10-25 15:56 UTC (permalink / raw)
  To: binutils

On Fri, Oct 22, 2010 at 10:26:41AM -0400, Daniel Jacobowitz wrote:
> On Fri, Oct 22, 2010 at 02:45:49PM +1030, Alan Modra wrote:
> > On Thu, Oct 21, 2010 at 10:35:38PM -0400, Daniel Jacobowitz wrote:
> > > What's your opinion of a flat-out hack then?
> > 
> > What does one more hack matter?  :-)
> 
> Here's the patch, then.  It builds for all targets and tests OK on
> x86_64.  I'm going to run some more tests before I commit it.

Committed.

-- 
Daniel Jacobowitz
CodeSourcery

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2010-10-25 15:56 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-10-21 21:41 gc-sections and DWARF ranges Daniel Jacobowitz
2010-10-21 23:34 ` Alan Modra
2010-10-22  2:35   ` Daniel Jacobowitz
2010-10-22  4:16     ` Alan Modra
2010-10-22 14:27       ` Daniel Jacobowitz
2010-10-25 15:56         ` Daniel Jacobowitz
2010-10-22 15:40 ` Richard Henderson
2010-10-22 17:51   ` Cary Coutant
2010-10-22 20:12   ` Daniel Jacobowitz
2010-10-22 18:23 ` Cary Coutant
2010-10-22 20:09   ` Daniel Jacobowitz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).