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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: h8300-hms-ld segfaults (with a small testcase)


On Mon, Dec 16, 2002 at 04:27:53PM -0000, Max Bowsher wrote:
> In this case, a generic hash table is created, then treated as a h8300
> extended one.

Would someone please check that the following patch cures the
segfault (and doesn't break something)?

	* coff-h8300.c: Include libiberty.h.
	(h8300_reloc16_extra_cases): Check the hash table creator before
	referencing h8300 specific fields.  Stash the hash table pointer
	in a local var.  Comment typo fixes.
	(h8300_bfd_link_add_symbols): Likewise.

Index: bfd/coff-h8300.c
===================================================================
RCS file: /cvs/src/src/bfd/coff-h8300.c,v
retrieving revision 1.15
diff -u -p -r1.15 coff-h8300.c
--- bfd/coff-h8300.c	30 Nov 2002 08:39:35 -0000	1.15
+++ bfd/coff-h8300.c	18 Dec 2002 13:16:48 -0000
@@ -28,6 +28,7 @@
 #include "coff/h8300.h"
 #include "coff/internal.h"
 #include "libcoff.h"
+#include "libiberty.h"
 
 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (1)
 
@@ -1091,7 +1092,25 @@ h8300_reloc16_extra_cases (abfd, link_in
 	const char *name;
 	struct funcvec_hash_table *ftab;
 	struct funcvec_hash_entry *h;
-	asection *vectors_sec = h8300_coff_hash_table (link_info)->vectors_sec;
+	struct h8300_coff_link_hash_table *htab;
+	asection *vectors_sec;
+
+	if (link_info->hash->creator != abfd->xvec)
+	  {
+	    (*_bfd_error_handler)
+	      (_("cannot handle R_MEM_INDIRECT reloc when using %s output"),
+	       link_info->hash->creator->name);
+
+	    /* What else can we do?  This function doesn't allow return
+	       of an error, and we don't want to call abort as that
+	       indicates an internal error.  */
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+	    xexit (EXIT_FAILURE);
+	  }
+	htab = h8300_coff_hash_table (link_info);
+	vectors_sec = htab->vectors_sec;
 
 	/* First see if this is a reloc against the absolute symbol
 	   or against a symbol with a nonnegative value <= 0xff.  */
@@ -1140,12 +1159,12 @@ h8300_reloc16_extra_cases (abfd, link_in
 	    name = new_name;
 	  }
 
-	ftab = h8300_coff_hash_table (link_info)->funcvec_hash_table;
+	ftab = htab->funcvec_hash_table;
 	h = funcvec_hash_lookup (ftab, name, FALSE, FALSE);
 
 	/* This shouldn't ever happen.  If it does that means we've got
 	   data corruption of some kind.  Aborting seems like a reasonable
-	   think to do here.  */
+	   thing to do here.  */
 	if (h == NULL || vectors_sec == NULL)
 	  abort ();
 
@@ -1214,24 +1233,30 @@ h8300_bfd_link_add_symbols (abfd, info)
   asection *sec;
   struct funcvec_hash_table *funcvec_hash_table;
   bfd_size_type amt;
+  struct h8300_coff_link_hash_table *htab;
+
+  /* Add the symbols using the generic code.  */
+  _bfd_generic_link_add_symbols (abfd, info);
+
+  if (info->hash->creator != abfd->xvec)
+    return TRUE;
+
+  htab = h8300_coff_hash_table (info);
 
   /* If we haven't created a vectors section, do so now.  */
-  if (!h8300_coff_hash_table (info)->vectors_sec)
+  if (!htab->vectors_sec)
     {
       flagword flags;
 
       /* Make sure the appropriate flags are set, including SEC_IN_MEMORY.  */
       flags = (SEC_ALLOC | SEC_LOAD
 	       | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_READONLY);
-      h8300_coff_hash_table (info)->vectors_sec = bfd_make_section (abfd,
-								    ".vectors");
+      htab->vectors_sec = bfd_make_section (abfd, ".vectors");
 
       /* If the section wasn't created, or we couldn't set the flags,
-	 quit quickly now, rather than dieing a painful death later.  */
-      if (! h8300_coff_hash_table (info)->vectors_sec
-	  || ! bfd_set_section_flags (abfd,
-				      h8300_coff_hash_table(info)->vectors_sec,
-				      flags))
+	 quit quickly now, rather than dying a painful death later.  */
+      if (!htab->vectors_sec
+	  || !bfd_set_section_flags (abfd, htab->vectors_sec, flags))
 	return FALSE;
 
       /* Also create the vector hash table.  */
@@ -1250,14 +1275,11 @@ h8300_bfd_link_add_symbols (abfd, info)
 	}
 
       /* Store away a pointer to the funcvec hash table.  */
-      h8300_coff_hash_table (info)->funcvec_hash_table = funcvec_hash_table;
+      htab->funcvec_hash_table = funcvec_hash_table;
     }
 
   /* Load up the function vector hash table.  */
-  funcvec_hash_table = h8300_coff_hash_table (info)->funcvec_hash_table;
-
-  /* Add the symbols using the generic code.  */
-  _bfd_generic_link_add_symbols (abfd, info);
+  funcvec_hash_table = htab->funcvec_hash_table;
 
   /* Now scan the relocs for all the sections in this bfd; create
      additional space in the .vectors section as needed.  */
@@ -1322,7 +1344,7 @@ h8300_bfd_link_add_symbols (abfd, info)
 		}
 
 	      /* Look this symbol up in the function vector hash table.  */
-	      ftab = h8300_coff_hash_table (info)->funcvec_hash_table;
+	      ftab = htab->funcvec_hash_table;
 	      h = funcvec_hash_lookup (ftab, name, FALSE, FALSE);
 
 	      /* If this symbol isn't already in the hash table, add
@@ -1339,10 +1361,10 @@ h8300_bfd_link_add_symbols (abfd, info)
 		  /* Bump the size of the vectors section.  Each vector
 		     takes 2 bytes on the h8300 and 4 bytes on the h8300h.  */
 		  if (bfd_get_mach (abfd) == bfd_mach_h8300)
-		    h8300_coff_hash_table (info)->vectors_sec->_raw_size += 2;
+		    htab->vectors_sec->_raw_size += 2;
 		  else if (bfd_get_mach (abfd) == bfd_mach_h8300h
 			   || bfd_get_mach (abfd) == bfd_mach_h8300s)
-		    h8300_coff_hash_table (info)->vectors_sec->_raw_size += 4;
+		    htab->vectors_sec->_raw_size += 4;
 		}
 	    }
 	}
@@ -1353,7 +1375,7 @@ h8300_bfd_link_add_symbols (abfd, info)
 
   /* Now actually allocate some space for the function vector.  It's
      wasteful to do this more than once, but this is easier.  */
-  sec = h8300_coff_hash_table (info)->vectors_sec;
+  sec = htab->vectors_sec;
   if (sec->_raw_size != 0)
     {
       /* Free the old contents.  */

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre


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