RFC: Mark discarded debug info more thoroughly

Daniel Jacobowitz drow@false.org
Fri Oct 27 03:41:00 GMT 2006


On Thu, Oct 26, 2006 at 11:54:06AM -0400, Daniel Jacobowitz wrote:
> Here is a version of the patch which adjusts all ELF targets that I
> could readily find the right place to change (a couple done by hand,
> plus searches for r_symndx == 0).  I've built it with
> --enable-targets=all, and tested a few of the changed targets, but not
> all.
> 
> There's also a testcase.  I expect that it is going to fail on a bunch
> of more obscure targets that I haven't tested.  Should I build and test
> all ELF targets?  If so, does anyone have a current list of target
> tuples to test, and if so, should it be in CVS somewhere?

Questions stand; here's a revised version that also fixes SH.

-- 
Daniel Jacobowitz
CodeSourcery

2006-10-26  Daniel Jacobowitz  <dan@codesourcery.com>

	* libbfd-in.h (_bfd_clear_contents): New prototype.
	* reloc.c (_bfd_clear_contents): New.
	* libbfd.h: Regenerated.

	* elf32-arm.c (elf32_arm_final_link_relocate): Use
	_bfd_clear_contents.
	* elf32-hppa.c (elf32_hppa_relocate_section): Likewise.
	* elf32-i386.c (elf_i386_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.
	* elf64-ppc.c (ppc64_elf_relocate_section): Likewise.
	* elf64-s390.c (elf_s390_relocate_section): Likewise.
	* elf64-x86-64.c (elf64_x86_64_relocate_section): Likewise.
	* elfxx-sparc.c (_bfd_sparc_elf_relocate_section): Likewise.

	* elfxx-ia64.c (elfNN_ia64_relocate_section): Set value to
	zero for discarded symbols.
	* elfxx-mips.c (mips_elf_calculate_relocation): Likewise.

2006-10-26  Daniel Jacobowitz  <dan@codesourcery.com>

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

Index: bfd/elf32-arm.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-arm.c,v
retrieving revision 1.97
diff -u -p -r1.97 elf32-arm.c
--- bfd/elf32-arm.c	19 Oct 2006 02:10:41 -0000	1.97
+++ bfd/elf32-arm.c	26 Oct 2006 15:39:50 -0000
@@ -3654,7 +3654,10 @@ elf32_arm_final_link_relocate (reloc_how
 	 from removed linkonce sections, or sections discarded by
 	 a linker script.  */
       if (r_symndx == 0)
-	return bfd_reloc_ok;
+	{
+	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
+	  return bfd_reloc_ok;
+	}
 
       /* Handle relocations which should use the PLT entry.  ABS32/REL32
 	 will use the symbol's value, which may point to a PLT entry, but we
Index: bfd/elf32-hppa.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-hppa.c,v
retrieving revision 1.148
diff -u -p -r1.148 elf32-hppa.c
--- bfd/elf32-hppa.c	17 Oct 2006 13:41:47 -0000	1.148
+++ bfd/elf32-hppa.c	26 Oct 2006 15:39:51 -0000
@@ -3942,8 +3942,14 @@ elf32_hppa_relocate_section (bfd *output
 	  /* r_symndx will be zero only for relocs against symbols
 	     from removed linkonce sections, or sections discarded by
 	     a linker script.  */
-	  if (r_symndx == 0
-	      || (input_section->flags & SEC_ALLOC) == 0)
+	  if (r_symndx == 0)
+	    {
+	      _bfd_clear_contents (elf_hppa_howto_table + r_type, input_bfd,
+				   contents + rela->r_offset);
+	      break;
+	    }
+
+	  if ((input_section->flags & SEC_ALLOC) == 0)
 	    break;
 
 	  /* The reloc types handled here and this conditional
Index: bfd/elf32-i386.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-i386.c,v
retrieving revision 1.167
diff -u -p -r1.167 elf32-i386.c
--- bfd/elf32-i386.c	17 Oct 2006 13:41:46 -0000	1.167
+++ bfd/elf32-i386.c	26 Oct 2006 15:39:51 -0000
@@ -2395,17 +2395,12 @@ elf_i386_relocate_section (bfd *output_b
 
       if (r_symndx == 0)
 	{
-	/* r_symndx will be zero only for relocs against symbols from
-	   removed linkonce sections, or sections discarded by a linker
-	   script.  For these relocs, we just want the section contents
-	   zeroed.  Avoid any special processing in the switch below.  */
-	  r_type = R_386_NONE;
-
-	  relocation = 0;
-	  if (howto->pc_relative)
-	    relocation = (input_section->output_section->vma
-			  + input_section->output_offset
-			  + rel->r_offset);
+	  /* r_symndx will be zero only for relocs against symbols from
+	     removed linkonce sections, or sections discarded by a linker
+	     script.  For these relocs, we just want the section contents
+	     zeroed.  Avoid any special processing.  */
+	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
+	  continue;
 	}
 
       switch (r_type)
Index: bfd/elf32-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-ppc.c,v
retrieving revision 1.205
diff -u -p -r1.205 elf32-ppc.c
--- bfd/elf32-ppc.c	17 Oct 2006 13:41:47 -0000	1.205
+++ bfd/elf32-ppc.c	26 Oct 2006 15:39:52 -0000
@@ -6180,7 +6180,10 @@ ppc_elf_relocate_section (bfd *output_bf
 	     a linker script.  */
 	dodyn:
 	  if (r_symndx == 0)
-	    break;
+	    {
+	      _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
+	      break;
+	    }
 	  /* Fall thru.  */
 
 	  if ((input_section->flags & SEC_ALLOC) == 0)
Index: bfd/elf32-s390.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-s390.c,v
retrieving revision 1.88
diff -u -p -r1.88 elf32-s390.c
--- bfd/elf32-s390.c	17 Oct 2006 13:41:47 -0000	1.88
+++ bfd/elf32-s390.c	26 Oct 2006 15:39:52 -0000
@@ -2543,8 +2543,13 @@ elf_s390_relocate_section (output_bfd, i
 	  /* r_symndx will be zero only for relocs against symbols
 	     from removed linkonce sections, or sections discarded by
 	     a linker script.  */
-	  if (r_symndx == 0
-	      || (input_section->flags & SEC_ALLOC) == 0)
+	  if (r_symndx == 0)
+	    {
+	      _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
+	      break;
+	    }
+
+	  if ((input_section->flags & SEC_ALLOC) == 0)
 	    break;
 
 	  if ((info->shared
Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.249
diff -u -p -r1.249 elf64-ppc.c
--- bfd/elf64-ppc.c	23 Oct 2006 03:20:56 -0000	1.249
+++ bfd/elf64-ppc.c	26 Oct 2006 15:39:53 -0000
@@ -10728,7 +10728,11 @@ ppc64_elf_relocate_section (bfd *output_
 	     a linker script.  */
 	dodyn:
 	  if (r_symndx == 0)
-	    break;
+	    {
+	      _bfd_clear_contents (ppc64_elf_howto_table[r_type], input_bfd,
+				   contents + rel->r_offset);
+	      break;
+	    }
 	  /* Fall thru.  */
 
 	dodyn2:
Index: bfd/elf64-s390.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-s390.c,v
retrieving revision 1.88
diff -u -p -r1.88 elf64-s390.c
--- bfd/elf64-s390.c	17 Oct 2006 13:41:47 -0000	1.88
+++ bfd/elf64-s390.c	26 Oct 2006 15:39:53 -0000
@@ -2522,8 +2522,13 @@ elf_s390_relocate_section (output_bfd, i
 	  /* r_symndx will be zero only for relocs against symbols
 	     from removed linkonce sections, or sections discarded by
 	     a linker script.  */
-	  if (r_symndx == 0
-	      || (input_section->flags & SEC_ALLOC) == 0)
+	  if (r_symndx == 0)
+	    {
+	      _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
+	      break;
+	    }
+
+	  if ((input_section->flags & SEC_ALLOC) == 0)
 	    break;
 
 	  if ((info->shared
Index: bfd/elf64-x86-64.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-x86-64.c,v
retrieving revision 1.127
diff -u -p -r1.127 elf64-x86-64.c
--- bfd/elf64-x86-64.c	17 Oct 2006 13:41:47 -0000	1.127
+++ bfd/elf64-x86-64.c	26 Oct 2006 15:39:54 -0000
@@ -2370,8 +2370,13 @@ elf64_x86_64_relocate_section (bfd *outp
 	  /* r_symndx will be zero only for relocs against symbols
 	     from removed linkonce sections, or sections discarded by
 	     a linker script.  */
-	  if (r_symndx == 0
-	      || (input_section->flags & SEC_ALLOC) == 0)
+	  if (r_symndx == 0)
+	    {
+	      _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
+	      break;
+	    }
+
+	  if ((input_section->flags & SEC_ALLOC) == 0)
 	    break;
 
 	  if ((info->shared
Index: bfd/elfxx-ia64.c
===================================================================
RCS file: /cvs/src/src/bfd/elfxx-ia64.c,v
retrieving revision 1.192
diff -u -p -r1.192 elfxx-ia64.c
--- bfd/elfxx-ia64.c	17 Oct 2006 13:41:47 -0000	1.192
+++ bfd/elfxx-ia64.c	26 Oct 2006 15:39:54 -0000
@@ -4751,6 +4751,12 @@ elfNN_ia64_relocate_section (output_bfd,
 	case R_IA64_LTV32LSB:
 	case R_IA64_LTV64MSB:
 	case R_IA64_LTV64LSB:
+	  /* r_symndx will be zero only for relocs against symbols
+	     from removed linkonce sections, or sections discarded by
+	     a linker script.  */
+	  if (r_symndx == 0)
+	    value = 0;
+
 	  r = elfNN_ia64_install_value (hit_addr, value, r_type);
 	  break;
 
Index: bfd/elfxx-mips.c
===================================================================
RCS file: /cvs/src/src/bfd/elfxx-mips.c,v
retrieving revision 1.189
diff -u -p -r1.189 elfxx-mips.c
--- bfd/elfxx-mips.c	20 Oct 2006 07:59:44 -0000	1.189
+++ bfd/elfxx-mips.c	26 Oct 2006 15:39:55 -0000
@@ -4312,6 +4312,11 @@ mips_elf_calculate_relocation (bfd *abfd
 						   input_section))
 	    return bfd_reloc_undefined;
 	}
+      else if (r_symndx == 0)
+	/* r_symndx will be zero only for relocs against symbols
+	   from removed linkonce sections, or sections discarded by
+	   a linker script.  */
+	value = 0;
       else
 	{
 	  if (r_type != R_MIPS_REL32)
Index: bfd/elfxx-sparc.c
===================================================================
RCS file: /cvs/src/src/bfd/elfxx-sparc.c,v
retrieving revision 1.27
diff -u -p -r1.27 elfxx-sparc.c
--- bfd/elfxx-sparc.c	17 Oct 2006 13:41:47 -0000	1.27
+++ bfd/elfxx-sparc.c	26 Oct 2006 15:39:55 -0000
@@ -2755,8 +2755,13 @@ _bfd_sparc_elf_relocate_section (bfd *ou
 	  /* r_symndx will be zero only for relocs against symbols
 	     from removed linkonce sections, or sections discarded by
 	     a linker script.  */
-	  if (r_symndx == 0
-	      || (input_section->flags & SEC_ALLOC) == 0)
+	  if (r_symndx == 0)
+	    {
+	      _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
+	      break;
+	    }
+
+	  if ((input_section->flags & SEC_ALLOC) == 0)
 	    break;
 
 	  if ((info->shared
Index: bfd/libbfd-in.h
===================================================================
RCS file: /cvs/src/src/bfd/libbfd-in.h,v
retrieving revision 1.66
diff -u -p -r1.66 libbfd-in.h
--- bfd/libbfd-in.h	19 Jun 2006 13:17:43 -0000	1.66
+++ bfd/libbfd-in.h	26 Oct 2006 15:39:56 -0000
@@ -547,6 +547,10 @@ extern bfd_reloc_status_type _bfd_final_
 extern bfd_reloc_status_type _bfd_relocate_contents
   (reloc_howto_type *, bfd *, bfd_vma, bfd_byte *);
 
+/* Clear a given location using a given howto.  */
+extern void _bfd_clear_contents (reloc_howto_type *howto, bfd *input_bfd,
+				 bfd_byte *location);
+
 /* Link stabs in sections in the first pass.  */
 
 extern bfd_boolean _bfd_link_section_stabs
Index: bfd/libbfd.h
===================================================================
RCS file: /cvs/src/src/bfd/libbfd.h,v
retrieving revision 1.187
diff -u -p -r1.187 libbfd.h
--- bfd/libbfd.h	25 Oct 2006 06:49:20 -0000	1.187
+++ bfd/libbfd.h	26 Oct 2006 15:39:56 -0000
@@ -552,6 +552,10 @@ extern bfd_reloc_status_type _bfd_final_
 extern bfd_reloc_status_type _bfd_relocate_contents
   (reloc_howto_type *, bfd *, bfd_vma, bfd_byte *);
 
+/* Clear a given location using a given howto.  */
+extern void _bfd_clear_contents (reloc_howto_type *howto, bfd *input_bfd,
+				 bfd_byte *location);
+
 /* Link stabs in sections in the first pass.  */
 
 extern bfd_boolean _bfd_link_section_stabs
Index: bfd/reloc.c
===================================================================
RCS file: /cvs/src/src/bfd/reloc.c,v
retrieving revision 1.158
diff -u -p -r1.158 reloc.c
--- bfd/reloc.c	25 Oct 2006 06:49:20 -0000	1.158
+++ bfd/reloc.c	26 Oct 2006 15:39:56 -0000
@@ -1545,6 +1545,72 @@ _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
+   relocations against discarded symbols, to make ignorable debug or unwind
+   information more obvious.  */
+
+void
+_bfd_clear_contents (reloc_howto_type *howto,
+		     bfd *input_bfd,
+		     bfd_byte *location)
+{
+  int size;
+  bfd_vma x = 0;
+
+  /* Get the value we are going to relocate.  */
+  size = bfd_get_reloc_size (howto);
+  switch (size)
+    {
+    default:
+    case 0:
+      abort ();
+    case 1:
+      x = bfd_get_8 (input_bfd, location);
+      break;
+    case 2:
+      x = bfd_get_16 (input_bfd, location);
+      break;
+    case 4:
+      x = bfd_get_32 (input_bfd, location);
+      break;
+    case 8:
+#ifdef BFD64
+      x = bfd_get_64 (input_bfd, location);
+#else
+      abort ();
+#endif
+      break;
+    }
+
+  /* Zero out the unwanted bits of X.  */
+  x &= ~howto->dst_mask;
+
+  /* Put the relocated value back in the object file.  */
+  switch (size)
+    {
+    default:
+    case 0:
+      abort ();
+    case 1:
+      bfd_put_8 (input_bfd, x, location);
+      break;
+    case 2:
+      bfd_put_16 (input_bfd, x, location);
+      break;
+    case 4:
+      bfd_put_32 (input_bfd, x, location);
+      break;
+    case 8:
+#ifdef BFD64
+      bfd_put_64 (input_bfd, x, location);
+#else
+      abort ();
+#endif
+      break;
+    }
+}
+
 /*
 DOCDD
 INODE
Index: ld/testsuite/ld-discard/zero-rel.d
===================================================================
RCS file: ld/testsuite/ld-discard/zero-rel.d
diff -N ld/testsuite/ld-discard/zero-rel.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-discard/zero-rel.d	26 Oct 2006 15:39:57 -0000
@@ -0,0 +1,8 @@
+#source: zero-rel.s
+#ld: -T discard.ld
+#objdump: -s -j .debug_info
+
+.*:     file format .*elf.*
+
+Contents of section .debug_info:
+ 0000 0+( 0+)? +(\.+) .*
Index: ld/testsuite/ld-discard/zero-rel.s
===================================================================
RCS file: ld/testsuite/ld-discard/zero-rel.s
diff -N ld/testsuite/ld-discard/zero-rel.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/testsuite/ld-discard/zero-rel.s	26 Oct 2006 15:39:57 -0000
@@ -0,0 +1,11 @@
+	.text
+	.globl _start
+_start:
+
+	.section	.debug_info
+	.long	.Ltext
+	.long	.Ltext + 2
+
+	.section	.text.exit,"ax"
+.Ltext:
+	.long	0
Index: bfd/elf32-sh.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-sh.c,v
retrieving revision 1.144
diff -u -p -r1.144 elf32-sh.c
--- bfd/elf32-sh.c	17 Oct 2006 13:41:47 -0000	1.144
+++ bfd/elf32-sh.c	26 Oct 2006 17:36:02 -0000
@@ -3557,6 +3557,15 @@ sh_elf_relocate_section (bfd *output_bfd
 	case R_SH_IMM_MEDHI16_PCREL:
 	case R_SH_IMM_HI16_PCREL:
 #endif
+	  /* r_symndx will be zero only for relocs against symbols
+	     from removed linkonce sections, or sections discarded by
+	     a linker script.  */
+	  if (r_symndx == 0)
+	    {
+	      _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
+	      continue;
+	    }
+
 	  if (info->shared
 	      && (h == NULL
 		  || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT



More information about the Binutils mailing list