OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [xcoffsolib.c] - Diff between revs 105 and 1765

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 105 Rev 1765
/* Shared library support for RS/6000 (xcoff) object files, for GDB.
/* Shared library support for RS/6000 (xcoff) object files, for GDB.
   Copyright 1991, 1992 Free Software Foundation.
   Copyright 1991, 1992 Free Software Foundation.
   Contributed by IBM Corporation.
   Contributed by IBM Corporation.
 
 
   This file is part of GDB.
   This file is part of GDB.
 
 
   This program is free software; you can redistribute it and/or modify
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330,
   Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */
   Boston, MA 02111-1307, USA.  */
 
 
#if 0
#if 0
#include <sys/types.h>
#include <sys/types.h>
#include <sys/ldr.h>
#include <sys/ldr.h>
#endif
#endif
 
 
#include "defs.h"
#include "defs.h"
#include "bfd.h"
#include "bfd.h"
#include "xcoffsolib.h"
#include "xcoffsolib.h"
#include "inferior.h"
#include "inferior.h"
#include "command.h"
#include "command.h"
 
 
/* Hook to relocate symbols at runtime.  If gdb is build natively, this
/* Hook to relocate symbols at runtime.  If gdb is build natively, this
   hook is initialized in by rs6000-nat.c.  If not, it is currently left
   hook is initialized in by rs6000-nat.c.  If not, it is currently left
   NULL and never called. */
   NULL and never called. */
 
 
void (*xcoff_relocate_symtab_hook) PARAMS ((unsigned int)) = NULL;
void (*xcoff_relocate_symtab_hook) PARAMS ((unsigned int)) = NULL;
 
 
#ifdef SOLIB_SYMBOLS_MANUAL
#ifdef SOLIB_SYMBOLS_MANUAL
 
 
extern struct symtab *current_source_symtab;
extern struct symtab *current_source_symtab;
extern int current_source_line;
extern int current_source_line;
 
 
/* The real work of adding a shared library file to the symtab and
/* The real work of adding a shared library file to the symtab and
   the section list.  */
   the section list.  */
 
 
void
void
solib_add (arg_string, from_tty, target)
solib_add (arg_string, from_tty, target)
     char *arg_string;
     char *arg_string;
     int from_tty;
     int from_tty;
     struct target_ops *target;
     struct target_ops *target;
{
{
  char *val;
  char *val;
  struct vmap *vp = vmap;
  struct vmap *vp = vmap;
  struct objfile *obj;
  struct objfile *obj;
  struct symtab *saved_symtab;
  struct symtab *saved_symtab;
  int saved_line;
  int saved_line;
 
 
  int loaded = 0;                /* true if any shared obj loaded */
  int loaded = 0;                /* true if any shared obj loaded */
  int matched = 0;               /* true if any shared obj matched */
  int matched = 0;               /* true if any shared obj matched */
 
 
  if (arg_string == 0)
  if (arg_string == 0)
    re_comp (".");
    re_comp (".");
  else if (val = (char *) re_comp (arg_string))
  else if (val = (char *) re_comp (arg_string))
    {
    {
      error ("Invalid regexp: %s", val);
      error ("Invalid regexp: %s", val);
    }
    }
  if (!vp || !vp->nxt)
  if (!vp || !vp->nxt)
    return;
    return;
 
 
  /* save current symbol table and line number, in case they get changed
  /* save current symbol table and line number, in case they get changed
     in symbol loading process. */
     in symbol loading process. */
 
 
  saved_symtab = current_source_symtab;
  saved_symtab = current_source_symtab;
  saved_line = current_source_line;
  saved_line = current_source_line;
 
 
  /* skip over the first vmap, it is the main program, always loaded. */
  /* skip over the first vmap, it is the main program, always loaded. */
  vp = vp->nxt;
  vp = vp->nxt;
 
 
  for (; vp; vp = vp->nxt)
  for (; vp; vp = vp->nxt)
    {
    {
 
 
      if (re_exec (vp->name) || (*vp->member && re_exec (vp->member)))
      if (re_exec (vp->name) || (*vp->member && re_exec (vp->member)))
        {
        {
 
 
          matched = 1;
          matched = 1;
 
 
          /* if already loaded, continue with the next one. */
          /* if already loaded, continue with the next one. */
          if (vp->loaded)
          if (vp->loaded)
            {
            {
 
 
              printf_unfiltered ("%s%s%s%s: already loaded.\n",
              printf_unfiltered ("%s%s%s%s: already loaded.\n",
                                 *vp->member ? "(" : "",
                                 *vp->member ? "(" : "",
                                 vp->member,
                                 vp->member,
                                 *vp->member ? ") " : "",
                                 *vp->member ? ") " : "",
                                 vp->name);
                                 vp->name);
              continue;
              continue;
            }
            }
 
 
          printf_unfiltered ("Loading  %s%s%s%s...",
          printf_unfiltered ("Loading  %s%s%s%s...",
                             *vp->member ? "(" : "",
                             *vp->member ? "(" : "",
                             vp->member,
                             vp->member,
                             *vp->member ? ") " : "",
                             *vp->member ? ") " : "",
                             vp->name);
                             vp->name);
          gdb_flush (gdb_stdout);
          gdb_flush (gdb_stdout);
 
 
          /* This is gross and doesn't work.  If this code is re-enabled,
          /* This is gross and doesn't work.  If this code is re-enabled,
             just stick a objfile member into the struct vmap; that's the
             just stick a objfile member into the struct vmap; that's the
             way solib.c (for SunOS/SVR4) does it.  */
             way solib.c (for SunOS/SVR4) does it.  */
          obj = lookup_objfile_bfd (vp->bfd);
          obj = lookup_objfile_bfd (vp->bfd);
          if (!obj)
          if (!obj)
            {
            {
              warning ("\nObj structure for the shared object not found. Loading failed.");
              warning ("\nObj structure for the shared object not found. Loading failed.");
              continue;
              continue;
            }
            }
 
 
          syms_from_objfile (obj, NULL, 0, 0);
          syms_from_objfile (obj, NULL, 0, 0);
          new_symfile_objfile (obj, 0, 0);
          new_symfile_objfile (obj, 0, 0);
          vmap_symtab (vp);
          vmap_symtab (vp);
          printf_unfiltered ("Done.\n");
          printf_unfiltered ("Done.\n");
          loaded = vp->loaded = 1;
          loaded = vp->loaded = 1;
        }
        }
    }
    }
  /* if any shared object is loaded, then misc_func_vector needs sorting. */
  /* if any shared object is loaded, then misc_func_vector needs sorting. */
  if (loaded)
  if (loaded)
    {
    {
#if 0
#if 0
      sort_misc_function_vector ();
      sort_misc_function_vector ();
#endif
#endif
      current_source_symtab = saved_symtab;
      current_source_symtab = saved_symtab;
      current_source_line = saved_line;
      current_source_line = saved_line;
 
 
      /* Getting new symbols might change our opinion about what is frameless.
      /* Getting new symbols might change our opinion about what is frameless.
         Is this correct?? FIXME. */
         Is this correct?? FIXME. */
/*    reinit_frame_cache(); */
/*    reinit_frame_cache(); */
    }
    }
  else if (!matched)
  else if (!matched)
    printf_unfiltered ("No matching shared object found.\n");
    printf_unfiltered ("No matching shared object found.\n");
}
}
#endif /* SOLIB_SYMBOLS_MANUAL */
#endif /* SOLIB_SYMBOLS_MANUAL */
 
 
/* Return the module name of a given text address. Note that returned buffer
/* Return the module name of a given text address. Note that returned buffer
   is not persistent. */
   is not persistent. */
 
 
char *
char *
pc_load_segment_name (addr)
pc_load_segment_name (addr)
     CORE_ADDR addr;
     CORE_ADDR addr;
{
{
  static char buffer[BUFSIZ];
  static char buffer[BUFSIZ];
  struct vmap *vp = vmap;
  struct vmap *vp = vmap;
 
 
  buffer[0] = buffer[1] = '\0';
  buffer[0] = buffer[1] = '\0';
  for (; vp; vp = vp->nxt)
  for (; vp; vp = vp->nxt)
    if (vp->tstart <= addr && addr < vp->tend)
    if (vp->tstart <= addr && addr < vp->tend)
      {
      {
        if (*vp->member)
        if (*vp->member)
          {
          {
            buffer[0] = '(';
            buffer[0] = '(';
            strcat (&buffer[1], vp->member);
            strcat (&buffer[1], vp->member);
            strcat (buffer, ")");
            strcat (buffer, ")");
          }
          }
        strcat (buffer, vp->name);
        strcat (buffer, vp->name);
        return buffer;
        return buffer;
      }
      }
  return "(unknown load module)";
  return "(unknown load module)";
}
}
 
 
static void solib_info PARAMS ((char *, int));
static void solib_info PARAMS ((char *, int));
 
 
static void
static void
solib_info (args, from_tty)
solib_info (args, from_tty)
     char *args;
     char *args;
     int from_tty;
     int from_tty;
{
{
  struct vmap *vp = vmap;
  struct vmap *vp = vmap;
 
 
  /* Check for new shared libraries loaded with load ().  */
  /* Check for new shared libraries loaded with load ().  */
  if (xcoff_relocate_symtab_hook != NULL)
  if (xcoff_relocate_symtab_hook != NULL)
    (*xcoff_relocate_symtab_hook) (inferior_pid);
    (*xcoff_relocate_symtab_hook) (inferior_pid);
 
 
  if (vp == NULL || vp->nxt == NULL)
  if (vp == NULL || vp->nxt == NULL)
    {
    {
      printf_unfiltered ("No shared libraries loaded at this time.\n");
      printf_unfiltered ("No shared libraries loaded at this time.\n");
      return;
      return;
    }
    }
 
 
  /* Skip over the first vmap, it is the main program, always loaded.  */
  /* Skip over the first vmap, it is the main program, always loaded.  */
  vp = vp->nxt;
  vp = vp->nxt;
 
 
  printf_unfiltered ("\
  printf_unfiltered ("\
Text Range              Data Range              Syms    Shared Object Library\n");
Text Range              Data Range              Syms    Shared Object Library\n");
 
 
  for (; vp != NULL; vp = vp->nxt)
  for (; vp != NULL; vp = vp->nxt)
    {
    {
      printf_unfiltered ("0x%s-0x%s     0x%s-0x%s       %s      %s%s%s%s\n",
      printf_unfiltered ("0x%s-0x%s     0x%s-0x%s       %s      %s%s%s%s\n",
                         paddr (vp->tstart),paddr (vp->tend),
                         paddr (vp->tstart),paddr (vp->tend),
                         paddr (vp->dstart), paddr (vp->dend),
                         paddr (vp->dstart), paddr (vp->dend),
                         vp->loaded ? "Yes" : "No ",
                         vp->loaded ? "Yes" : "No ",
                         *vp->member ? "(" : "",
                         *vp->member ? "(" : "",
                         vp->member,
                         vp->member,
                         *vp->member ? ") " : "",
                         *vp->member ? ") " : "",
                         vp->name);
                         vp->name);
    }
    }
}
}
 
 
void
void
sharedlibrary_command (args, from_tty)
sharedlibrary_command (args, from_tty)
     char *args;
     char *args;
     int from_tty;
     int from_tty;
{
{
  dont_repeat ();
  dont_repeat ();
 
 
  /* Check for new shared libraries loaded with load ().  */
  /* Check for new shared libraries loaded with load ().  */
  if (xcoff_relocate_symtab_hook != NULL)
  if (xcoff_relocate_symtab_hook != NULL)
    (*xcoff_relocate_symtab_hook) (inferior_pid);
    (*xcoff_relocate_symtab_hook) (inferior_pid);
 
 
#ifdef SOLIB_SYMBOLS_MANUAL
#ifdef SOLIB_SYMBOLS_MANUAL
  solib_add (args, from_tty, (struct target_ops *) 0);
  solib_add (args, from_tty, (struct target_ops *) 0);
#endif /* SOLIB_SYMBOLS_MANUAL */
#endif /* SOLIB_SYMBOLS_MANUAL */
}
}
 
 
void
void
_initialize_solib ()
_initialize_solib ()
{
{
  add_com ("sharedlibrary", class_files, sharedlibrary_command,
  add_com ("sharedlibrary", class_files, sharedlibrary_command,
           "Load shared object library symbols for files matching REGEXP.");
           "Load shared object library symbols for files matching REGEXP.");
  add_info ("sharedlibrary", solib_info,
  add_info ("sharedlibrary", solib_info,
            "Status of loaded shared object libraries");
            "Status of loaded shared object libraries");
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.