This is the mail archive of the gdb@sources.redhat.com mailing list for the GDB project.


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

RFC: Handle relocations against removed sections


This patch handles relocations against removed sections. It has:

1. A section is removed iff

! bfd_is_abs_section (sec) && bfd_is_abs_section (sec->output_section)

2. Zero relocations against removed sections in debug sections before
20031005 and issue a fatal error after that.

3. Zero relocations against removed linkonce sections before 20031005 and
issue a fatal error after that.

4. Relocation against removed section is a fatal error.

Any comments?


H.J.
----
2001-11-02  H.J. Lu  (hjl@gnu.org)

	* elflink.h (elf_link_input_bfd): Complain relocs against
	discarded sections.

Index: elflink.h
===================================================================
RCS file: /work/cvs/gnu/binutils/bfd/elflink.h,v
retrieving revision 1.88
diff -u -p -r1.88 elflink.h
--- elflink.h	2001/10/31 21:30:43	1.88
+++ elflink.h	2001/11/02 20:01:44
@@ -6079,6 +6079,7 @@ elf_link_input_bfd (finfo, input_bfd)
   asection *o;
   struct elf_backend_data *bed;
   boolean emit_relocs;
+  struct elf_link_hash_entry **sym_hashes;
 
   output_bfd = finfo->output_bfd;
   bed = get_elf_backend_data (output_bfd);
@@ -6251,6 +6252,7 @@ elf_link_input_bfd (finfo, input_bfd)
     }
 
   /* Relocate the contents of each section.  */
+  sym_hashes = elf_sym_hashes (input_bfd);
   for (o = input_bfd->sections; o != NULL; o = o->next)
     {
       bfd_byte *contents;
@@ -6298,50 +6300,114 @@ elf_link_input_bfd (finfo, input_bfd)
 	      && o->reloc_count > 0)
 	    return false;
 
-#if BFD_VERSION_DATE < 20031005
 	  {
 	    Elf_Internal_Rela *rel, *relend;
-	    /* Run through the relocs looking for any against section
-	       symbols from removed link-once sections.  Zero any such
-	       relocs.  We should really complain if anything in the
-	       final link tries to use it, but DWARF-based exception
-	       handling might have an entry in .eh_frame to describe a
-	       routine in the linkonce section, and it turns out to be
-	       hard to remove the .eh_frame entry too.  FIXME.  */
+	    /* Run through the relocs looking for any against symbols
+	       from discarded sections and section symbols from
+	       removed link-once sections. Complain about relocs
+	       against discarded sections. Zero relocs against removed
+	       link-once sections. We should really complain if
+	       anything in the final link tries to use it, but
+	       DWARF-based exception handling might have an entry in
+	       .eh_frame to describe a routine in the linkonce section,
+	       and it turns out to be hard to remove the .eh_frame
+	       entry too.  FIXME.  */
 	    rel = internal_relocs;
 	    relend = rel + o->reloc_count * bed->s->int_rels_per_ext_rel;
 	    for ( ; rel < relend; rel++)
 	      {
 		unsigned long r_symndx = ELF_R_SYM (rel->r_info);
 
-		if (r_symndx < locsymcount
-		    && (!elf_bad_symtab (input_bfd)
-			|| finfo->sections[r_symndx] != NULL))
+		if (r_symndx >= locsymcount
+		    || (elf_bad_symtab (input_bfd)
+			&& finfo->sections[r_symndx] == NULL))
 		  {
+		    struct elf_link_hash_entry *h;
+
+		    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+		    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;
+		    /* Complain if the definition comes from a
+		       discarded section.  */
+		    if ((h->root.type == bfd_link_hash_defined
+			 || h->root.type == bfd_link_hash_defweak)
+			&& ! bfd_is_abs_section (h->root.u.def.section)
+			&& bfd_is_abs_section (h->root.u.def.section->output_section))
+		      {
+#if BFD_VERSION_DATE < 20031005
+			if ((o->flags & SEC_DEBUGGING) != 0)
+			  {
+#if BFD_VERSION_DATE > 20021005
+			    (*finfo->info->callbacks->warning)
+			      (finfo->info,
+			       _("warning: relocation against removed section; zeroing"),
+				   NULL, input_bfd, o, rel->r_offset);
+#endif
+			      memset (rel, 0, sizeof (*rel));
+			  }
+			else
+#endif
+			  {
+			    if (! ((*finfo->info->callbacks->undefined_symbol)
+				    (finfo->info, h->root.root.string,
+				     input_bfd, o, rel->r_offset,
+				     true)))
+			      return false;
+			  }
+		      }
+		  }
+		else
+		  {
 		    isym = finfo->internal_syms + r_symndx;
 		    if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
 		      {
 			asection *sec = finfo->sections[r_symndx];
 
 			if (sec != NULL
-			    && (sec->flags & SEC_LINK_ONCE) != 0
+			    && ! bfd_is_abs_section (sec)
 			    && bfd_is_abs_section (sec->output_section))
 			  {
+#if BFD_VERSION_DATE < 20031005
+			    if ((o->flags & SEC_DEBUGGING) != 0
+			        || (sec->flags & SEC_LINK_ONCE) != 0)
+			      {
 #if BFD_VERSION_DATE > 20021005
-			    (*finfo->info->callbacks->warning)
-			      (finfo->info,
-			       _("warning: relocation against removed section; zeroing"),
-			       NULL, input_bfd, o, rel->r_offset);
+				(*finfo->info->callbacks->warning)
+				  (finfo->info,
+				   _("warning: relocation against removed section; zeroing"),
+				   NULL, input_bfd, o, rel->r_offset);
 #endif
-			    memset (rel, 0, sizeof (*rel));
+				memset (rel, 0, sizeof (*rel));
+			      }
+			    else
+#endif
+			      {
+#define SECTION_MESSAGE	"local symbols in discarded section"
+				boolean ok;
+				char *buf
+				  = (char *) bfd_malloc
+				      (strlen (sec->name) + 3
+				       + sizeof ( SECTION_MESSAGE));
+				if (buf != NULL)
+				  sprintf (buf, "%s: %s",
+					   SECTION_MESSAGE, sec->name);
+				else
+				  buf = (char *) sec->name;
+				ok = (*finfo->info->callbacks->undefined_symbol)
+				       (finfo->info, buf,
+					input_bfd, o, rel->r_offset,
+					true);
+				if (buf != sec->name)
+				  free (buf);
+				if (!ok)
+				  return false;
+			      }
 			  }
 		      }
 		  }
 	      }
 	  }
-#else
-#error "gcc should be fixed by now, and this kludge no longer needed"
-#endif
 
 	  /* Relocate the section by invoking a back end routine.
 


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