2001-01-02 Michael Snyder <msnyder@cleaver.cygnus.com>
[deliverable/binutils-gdb.git] / gdb / rs6000-nat.c
index 6afb4cf76c0e9ed2168ce5ec5e6b48db2fd48940..e89048485011bed721228457f3a4164eaa26f473 100644 (file)
@@ -605,17 +605,20 @@ vmap_symtab (struct vmap *vp)
        return;
       objfile = symfile_objfile;
     }
+  else if (!vp->loaded)
+    /* If symbols are not yet loaded, offsets are not yet valid. */
+    return;
 
   new_offsets = (struct section_offsets *) alloca (SIZEOF_SECTION_OFFSETS);
 
   for (i = 0; i < objfile->num_sections; ++i)
-    ANOFFSET (new_offsets, i) = ANOFFSET (objfile->section_offsets, i);
+    new_offsets->offsets[i] = ANOFFSET (objfile->section_offsets, i);
 
   /* The symbols in the object file are linked to the VMA of the section,
      relocate them VMA relative.  */
-  ANOFFSET (new_offsets, SECT_OFF_TEXT (objfile)) = vp->tstart - vp->tvma;
-  ANOFFSET (new_offsets, SECT_OFF_DATA (objfile)) = vp->dstart - vp->dvma;
-  ANOFFSET (new_offsets, SECT_OFF_BSS (objfile)) = vp->dstart - vp->dvma;
+  new_offsets->offsets[SECT_OFF_TEXT (objfile)] = vp->tstart - vp->tvma;
+  new_offsets->offsets[SECT_OFF_DATA (objfile)] = vp->dstart - vp->dvma;
+  new_offsets->offsets[SECT_OFF_BSS (objfile)] = vp->dstart - vp->dvma;
 
   objfile_relocate (objfile, new_offsets);
 }
@@ -632,6 +635,23 @@ objfile_symbol_add (void *arg)
   return 1;
 }
 
+/* Add symbols for a vmap. Return zero upon error.  */
+
+int
+vmap_add_symbols (struct vmap *vp)
+{
+  if (catch_errors (objfile_symbol_add, vp->objfile,
+                   "Error while reading shared library symbols:\n",
+                   RETURN_MASK_ALL))
+    {
+      /* Note this is only done if symbol reading was successful.  */
+      vp->loaded = 1;
+      vmap_symtab (vp);
+      return 1;
+    }
+  return 0;
+}
+
 /* Add a new vmap entry based on ldinfo() information.
 
    If ldi->ldinfo_fd is not valid (e.g. this struct ld_info is from a
@@ -666,8 +686,11 @@ add_vmap (LdInfo *ldi)
   else
     abfd = bfd_fdopenr (objname, gnutarget, fd);
   if (!abfd)
-    error ("Could not open `%s' as an executable file: %s",
-          objname, bfd_errmsg (bfd_get_error ()));
+    {
+      warning ("Could not open `%s' as an executable file: %s",
+              objname, bfd_errmsg (bfd_get_error ()));
+      return NULL;
+    }
 
   /* make sure we have an object file */
 
@@ -684,41 +707,35 @@ add_vmap (LdInfo *ldi)
 
       if (!last)
        {
+         warning ("\"%s\": member \"%s\" missing.", objname, mem);
          bfd_close (abfd);
-         /* FIXME -- should be error */
-         warning ("\"%s\": member \"%s\" missing.", abfd->filename, mem);
-         return 0;
+         return NULL;
        }
 
       if (!bfd_check_format (last, bfd_object))
        {
-         bfd_close (last);     /* XXX???       */
-         goto obj_err;
+         warning ("\"%s\": member \"%s\" not in executable format: %s.",
+                  objname, mem, bfd_errmsg (bfd_get_error ()));
+         bfd_close (last);
+         bfd_close (abfd);
+         return NULL;
        }
 
       vp = map_vmap (last, abfd);
     }
   else
     {
-    obj_err:
+      warning ("\"%s\": not in executable format: %s.",
+              objname, bfd_errmsg (bfd_get_error ()));
       bfd_close (abfd);
-      error ("\"%s\": not in executable format: %s.",
-            objname, bfd_errmsg (bfd_get_error ()));
-      /*NOTREACHED */
+      return NULL;
     }
   obj = allocate_objfile (vp->bfd, 0);
   vp->objfile = obj;
 
-#ifndef SOLIB_SYMBOLS_MANUAL
-  if (catch_errors (objfile_symbol_add, obj,
-                   "Error while reading shared library symbols:\n",
-                   RETURN_MASK_ALL))
-    {
-      /* Note this is only done if symbol reading was successful.  */
-      vmap_symtab (vp);
-      vp->loaded = 1;
-    }
-#endif
+  /* Always add symbols for the main objfile.  */
+  if (vp == vmap || auto_solib_add)
+    vmap_add_symbols (vp);
   return vp;
 }
 \f
@@ -908,7 +925,10 @@ set_host_arch (int pid)
   memset (&info, 0, sizeof info);
   info.bfd_arch_info = bfd_get_arch_info (&abfd);
 
-  gdbarch_update (info);
+  if (!gdbarch_update_p (info))
+    {
+      internal_error ("set_host_arch: failed to select architecture");
+    }
 }
 
 \f
@@ -928,7 +948,7 @@ xcoff_relocate_symtab (unsigned int pid)
   do
     {
       size = load_segs * ldisize;
-      ldi = (void *) xrealloc (ldi, load_segs * size);
+      ldi = (void *) xrealloc (ldi, size);
 
 #if 0
       /* According to my humble theory, AIX has some timing problems and
@@ -957,7 +977,7 @@ xcoff_relocate_symtab (unsigned int pid)
        }
     } while (rc == -1);
   if (ldi)
-    free (ldi);
+    xfree (ldi);
 }
 \f
 /* Core file stuff.  */
@@ -982,12 +1002,6 @@ xcoff_relocate_core (struct target_ops *target)
   char *buffer = xmalloc (buffer_size);
   struct cleanup *old = make_cleanup (free_current_contents, &buffer);
 
-  /* FIXME, this restriction should not exist.  For now, though I'll
-     avoid coredumps with error() pending a real fix.  */
-  if (vmap == NULL)
-    error
-      ("Can't debug a core file without an executable file (on the RS/6000)");
-
   ldinfo_sec = bfd_get_section_by_name (core_bfd, ".ldinfo");
   if (ldinfo_sec == NULL)
     {
@@ -1033,12 +1047,16 @@ xcoff_relocate_core (struct target_ops *target)
        ldi->l32.ldinfo_fd = -1;
 
       /* The first ldinfo is for the exec file, allocated elsewhere.  */
-      if (offset == 0)
+      if (offset == 0 && vmap != NULL)
        vp = vmap;
       else
        vp = add_vmap (ldi);
 
+      /* Process next shared library upon error. */
       offset += LDI_NEXT (ldi, arch64);
+      if (vp == NULL)
+       continue;
+
       vmap_secs (vp, ldi, arch64);
 
       /* Unless this is the exec file,
@@ -1122,9 +1140,5 @@ _initialize_core_rs6000 (void)
      starting a child process. */
   rs6000_set_host_arch_hook = set_host_arch;
 
-  /* For native configurations, where this module is included, inform
-     the xcoffsolib module where it can find the function for symbol table
-     relocation at runtime. */
-  xcoff_relocate_symtab_hook = xcoff_relocate_symtab;
   add_core_fns (&rs6000_core_fns);
 }
This page took 0.02517 seconds and 4 git commands to generate.