This is the mail archive of the gdb-patches@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]
Other format: [Raw text]

Re: GDB 5.2.1 patch for XFree86-4 module support


David O'Brien wrote:
> 
> I updated the GDB 5.1 patches at http://www.dawa.demon.co.uk/xfree-gdb/
> for 5.2.1.  Who owns them, and what would it take to get them into the
> FSF/GDB tree for GDB 5.3?
> 
> --
> -- David  (obrien@FreeBSD.org)

Hi David, 

First of all, we need some ChangeLog entries.

As for the breakpoint.c changes, that's my domain, and your changes
there are approved (well done, in fact).

For the dbxread.c change, I recommend that instead of this, 
you simply define SOFUN_ADDRESS_MAYBE_MISSING in your xfreemod.h 
file.  Same for the corresponding minsyms.c change.

For elfread, Jim Blandy and Elena Zannoni are the maintainers, 
one of them will have to review your changes.  Some explanation
for why you made them would be helpful.

For some of the remainder, I think the #ifdef has got to go.
We don't do things that way anymore.  You'll need to define
some sort of runtime control variable instead.

Since you changed the definition of symfile_bfd_open, you'll
need to change all the files that call it.  Fortunately, the
only other one is somread.c

Generally, I think this is pretty close to acceptable.

Michael Snyder 


> 
> Index: gdb/breakpoint.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/breakpoint.c,v
> retrieving revision 1.66
> diff -u -r1.66 breakpoint.c
> --- gdb/breakpoint.c    18 Feb 2002 13:35:29 -0000      1.66
> +++ gdb/breakpoint.c    22 Aug 2002 20:23:13 -0000
> @@ -2896,6 +2896,7 @@
>           bs_class = bp_nostop;
>           break;
>         case bp_shlib_event:
> +       case bp_xfreemod_event:
>           bs_class = shlib_event;
>           break;
>         case bp_thread_event:
> @@ -3083,7 +3084,8 @@
>      {bp_catch_vfork, "catch vfork"},
>      {bp_catch_exec, "catch exec"},
>      {bp_catch_catch, "catch catch"},
> -    {bp_catch_throw, "catch throw"}
> +    {bp_catch_throw, "catch throw"},
> +    {bp_xfreemod_event, "XFree86 module events"}
>    };
> 
>    static char *bpdisps[] =
> @@ -3234,6 +3236,7 @@
>      case bp_shlib_event:
>      case bp_thread_event:
>      case bp_overlay_event:
> +    case bp_xfreemod_event:
>        if (addressprint)
>         {
>           annotate_field (4);
> @@ -3881,6 +3884,28 @@
>        delete_breakpoint (b);
>  }
> 
> +#ifdef XFREE_MODULE_SUPPORT
> +void
> +remove_xfreemod_event_breakpoints (void)
> +{
> +  register struct breakpoint *b, *temp;
> +
> +  ALL_BREAKPOINTS_SAFE (b, temp)
> +    if (b->type == bp_xfreemod_event)
> +      delete_breakpoint (b);
> +}
> +
> +void
> +create_xfreemod_event_breakpoint (CORE_ADDR address)
> +{
> +  struct breakpoint *b;
> +
> +  b = create_internal_breakpoint (address, bp_xfreemod_event);
> +  b->type = bp_xfreemod_event;
> +
> +}
> +#endif
> +
>  #ifdef SOLIB_ADD
>  void
>  remove_solib_event_breakpoints (void)
> @@ -4358,6 +4383,7 @@
>      case bp_shlib_event:
>      case bp_thread_event:
>      case bp_overlay_event:
> +    case bp_xfreemod_event:
>        break;
>      }
>    if (say_where)
> @@ -6921,6 +6947,7 @@
>        /* This breakpoint is special, it's set up when the inferior
>           starts and we really don't want to touch it.  */
>      case bp_shlib_event:
> +    case bp_xfreemod_event:
> 
>        /* Like bp_shlib_event, this breakpoint type is special.
>          Once it is set up, we do not want to touch it.  */
> Index: gdb/breakpoint.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/breakpoint.h,v
> retrieving revision 1.11
> diff -u -r1.11 breakpoint.h
> --- gdb/breakpoint.h    6 Feb 2002 18:31:07 -0000       1.11
> +++ gdb/breakpoint.h    22 Aug 2002 20:23:13 -0000
> @@ -136,7 +136,12 @@
>      /* These are catchpoints to implement "catch catch" and "catch throw"
>         commands for C++ exception handling. */
>      bp_catch_catch,
> -    bp_catch_throw
> +    bp_catch_throw,
> +
> +    /* As for bp_shlib_event but when the xfree module loader informs
> +       us that a module has been loaded */
> +    bp_xfreemod_event
> +
> 
> 
>    };
> @@ -669,9 +674,13 @@
> 
>  extern struct breakpoint *create_thread_event_breakpoint (CORE_ADDR);
> 
> +extern void create_xfreemod_event_breakpoint (CORE_ADDR);
> +
>  extern void remove_solib_event_breakpoints (void);
> 
>  extern void remove_thread_event_breakpoints (void);
> +
> +extern void remove_xfreemod_event_breakpoints (void);
> 
>  extern void disable_breakpoints_in_shlibs (int silent);
> 
> Index: gdb/dbxread.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/dbxread.c,v
> retrieving revision 1.30.2.1
> diff -u -r1.30.2.1 dbxread.c
> --- gdb/dbxread.c       4 Apr 2002 22:33:49 -0000       1.30.2.1
> +++ gdb/dbxread.c       22 Aug 2002 20:23:14 -0000
> @@ -3106,7 +3106,7 @@
>             case 'F':
>               function_stab_type = type;
> 
> -#ifdef SOFUN_ADDRESS_MAYBE_MISSING
> +#if defined(SOFUN_ADDRESS_MAYBE_MISSING) || defined(XFREE_MODULE_SUPPORT)
>               /* Deal with the SunPRO 3.0 compiler which omits the address
>                  from N_FUN symbols.  */
>               if (type == N_FUN
> Index: gdb/elfread.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/elfread.c,v
> retrieving revision 1.20.2.1
> diff -u -r1.20.2.1 elfread.c
> --- gdb/elfread.c       25 Mar 2002 16:50:20 -0000      1.20.2.1
> +++ gdb/elfread.c       22 Aug 2002 20:23:14 -0000
> @@ -265,7 +265,7 @@
>               symaddr = sym->value;
>               if (symaddr == 0)
>                 continue;
> -             symaddr += offset;
> +             symaddr += ANOFFSET (objfile->section_offsets, 0);
>               msym = record_minimal_symbol_and_info
>                 ((char *) sym->name, symaddr,
>                  mst_solib_trampoline, NULL, sym->section, objfile);
> @@ -307,10 +307,26 @@
>                  interested in will have a section. */
>               /* Bfd symbols are section relative. */
>               symaddr = sym->value + sym->section->vma;
> -             /* Relocate all non-absolute symbols by the section offset.  */
> -             if (sym->section != &bfd_abs_section)
> +             /* Relocate all non-absolute symbols.  */
> +             if (STREQ (sym->section->name, ".text"))
>                 {
> -                 symaddr += offset;
> +                 symaddr += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT(objfile));
> +               }
> +             else if (STREQ (sym->section->name, ".data"))
> +               {
> +                 symaddr += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA(objfile));
> +               }
> +             else if (STREQ (sym->section->name, ".bss"))
> +               {
> +                 symaddr += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS(objfile));
> +               }
> +             else if (STREQ (sym->section->name, ".rodata"))
> +               {
> +                 symaddr += ANOFFSET (objfile->section_offsets, SECT_OFF_RODATA(objfile));
> +               }
> +             else if (sym->section != &bfd_abs_section)
> +               {
> +                 symaddr += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT(objfile));
>                 }
>               /* For non-absolute symbols, use the type of the section
>                  they are relative to, to intuit text/data.  Bfd provides
> @@ -344,7 +360,7 @@
>                     {
>                       if (sym->name[0] == '.')
>                         continue;
> -                     symaddr += offset;
> +                     symaddr += ANOFFSET (objfile->section_offsets, 0);
>                     }
>                 }
>               else if (sym->section->flags & SEC_CODE)
> @@ -450,7 +466,7 @@
>                           /* Relocate non-absolute symbols by the section offset. */
>                           if (sym->section != &bfd_abs_section)
>                             {
> -                             symaddr += offset;
> +                             symaddr += ANOFFSET (objfile->section_offsets, 0);
>                             }
>                           if (index != -1)
>                             sectinfo->sections[index] = symaddr;
> Index: gdb/fork-child.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/fork-child.c,v
> retrieving revision 1.17
> diff -u -r1.17 fork-child.c
> --- gdb/fork-child.c    7 Feb 2002 06:11:55 -0000       1.17
> +++ gdb/fork-child.c    22 Aug 2002 20:23:14 -0000
> @@ -377,6 +377,9 @@
>  #ifdef SOLIB_CREATE_INFERIOR_HOOK
>    SOLIB_CREATE_INFERIOR_HOOK (pid);
>  #endif
> +#ifdef XFREE_MODULE_SUPPORT
> +   xfreemod_create_inferior_hook(pid);
> +#endif
>  }
> 
>  /* An inferior Unix process CHILD_PID has been created by a call to
> Index: gdb/infrun.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/infrun.c,v
> retrieving revision 1.54
> diff -u -r1.54 infrun.c
> --- gdb/infrun.c        24 Feb 2002 22:31:19 -0000      1.54
> +++ gdb/infrun.c        22 Aug 2002 20:23:16 -0000
> @@ -1505,12 +1505,16 @@
>             if (breakpoints_inserted)
>               remove_breakpoints ();
> 
> -           /* Check for any newly added shared libraries if we're
> -              supposed to be adding them automatically.  Switch
> +           /* Check for any newly added shared libraries or XFree modules
> +              if we're supposed to be adding them automatically.  Switch
>                terminal for any messages produced by
>                breakpoint_re_set.  */
>             target_terminal_ours_for_output ();
>             SOLIB_ADD (NULL, 0, NULL, auto_solib_add);
> +#ifdef XFREE_MODULE_SUPPORT
> +           if (auto_solib_add)
> +             xfreemod_add (NULL, 0, NULL);
> +#endif
>             target_terminal_inferior ();
> 
>             /* Reinsert breakpoints and continue.  */
> @@ -2437,6 +2441,10 @@
>                breakpoint_re_set.  */
>             target_terminal_ours_for_output ();
>             SOLIB_ADD (NULL, 0, NULL, auto_solib_add);
> +#ifdef XFREE_MODULE_SUPPORT
> +           if (auto_solib_add)
> +             xfreemod_add (NULL, 0, NULL);
> +#endif
>             target_terminal_inferior ();
> 
>             /* Try to reenable shared library breakpoints, additional
> Index: gdb/minsyms.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/minsyms.c,v
> retrieving revision 1.19.2.1
> diff -u -r1.19.2.1 minsyms.c
> --- gdb/minsyms.c       25 Mar 2002 16:50:20 -0000      1.19.2.1
> +++ gdb/minsyms.c       22 Aug 2002 20:23:16 -0000
> @@ -505,7 +505,7 @@
>    return lookup_minimal_symbol_by_pc_section (pc, find_pc_mapped_section (pc));
>  }
> 
> -#ifdef SOFUN_ADDRESS_MAYBE_MISSING
> +#if defined(SOFUN_ADDRESS_MAYBE_MISSING) || defined(XFREE_MODULE_SUPPORT)
>  CORE_ADDR
>  find_stab_function_addr (char *namestring, char *filename,
>                          struct objfile *objfile)
> Index: gdb/symfile.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/symfile.c,v
> retrieving revision 1.54.2.3
> diff -u -r1.54.2.3 symfile.c
> --- gdb/symfile.c       22 Jun 2002 16:49:33 -0000      1.54.2.3
> +++ gdb/symfile.c       22 Aug 2002 20:23:17 -0000
> @@ -118,7 +118,7 @@
> 
>  static void cashier_psymtab (struct partial_symtab *);
> 
> -bfd *symfile_bfd_open (char *);
> +/*bfd *symfile_bfd_open (char *);*/
> 
>  int get_section_index (struct objfile *, char *);
> 
> @@ -838,10 +838,70 @@
>    struct partial_symtab *psymtab;
>    bfd *abfd;
> 
> -  /* Open a bfd for the file, and give user a chance to burp if we'd be
> -     interactively wiping out any existing symbols.  */
> +#ifdef XFREE_MODULE_SUPPORT
> +  struct cleanup *old_chain;
> +  char *p;
> +  /* Make a copy of the string that we can safely write into. */
> +
> +  name = strdup (name);
> +  old_chain = make_cleanup(free, name);
> +
> +  p = strstr(name, ".a:");
> +  if (p)
> +  {
> +      bfd *archive_bfd;
> +      char *component_name = p + 3;
> +      *(p+2) = 0;
> +      archive_bfd = symfile_bfd_open (name, bfd_archive);
> +
> +      /* Look for the archive member that we want
> +       *
> +       * FIXME - we will be invoked several times for the same archive
> +       * all this opening, closing and scanning is going to be dreadfully
> +       * slow.
> +       */
> +      for (abfd = bfd_openr_next_archived_file (archive_bfd, NULL);
> +          abfd;
> +          abfd = bfd_openr_next_archived_file (archive_bfd, abfd))
> +      {
> +         if (abfd->filename == NULL)
> +         {
> +             /* Some archive formats don't get the filenames filled in
> +                until the elements are opened.  */
> +             struct stat buf;
> +             bfd_stat_arch_elt (abfd, &buf);
> +         }
> +         /* printf_unfiltered("%s %s\n", abfd->filename, component_name); */
> +         if ((abfd->filename != NULL) &&
> +             (!strcmp (component_name, abfd->filename)))
> +         {
> +             break;
> +         }
> +         make_cleanup(bfd_close, abfd);
> +       }
> +      if (!bfd_check_format (abfd, bfd_object))
> +      {
> +         /* FIXME: should be checking for errors from bfd_close (for one thing,
> +            on error it does not free all the storage associated with the
> +            bfd).  */
> +         bfd_close (archive_bfd);
> +         error ("\"%s\": can't read symbols: %s:%s.", name, component_name,
> +                bfd_errmsg (bfd_get_error ()));
> +      }
> +      /* The bfd filename points into the bfd's internal storage,
> +        not to a block obtained directly from malloc.
> +        Replace it with a copy so that free_objfile does not
> +        pass a bogus pointer to free */
> +      bfd_get_filename (abfd) = strdup(bfd_get_filename (abfd));
> +  }
> +  else
> +#endif
> +  {
> +      /* Open a bfd for the file, and give user a chance to burp if we'd be
> +        interactively wiping out any existing symbols.  */
> 
> -  abfd = symfile_bfd_open (name);
> +      abfd = symfile_bfd_open (name, bfd_object);
> +  }
> 
>    if ((have_full_symbols () || have_partial_symbols ())
>        && mainline
> @@ -926,6 +986,9 @@
>    if (target_new_objfile_hook)
>      target_new_objfile_hook (objfile);
> 
> +#ifdef XFREE_MODULE_SUPPORT
> +  do_cleanups(old_chain);
> +#endif
>    return (objfile);
>  }
> 
> @@ -1086,7 +1149,7 @@
>     In case of trouble, error() is called.  */
> 
>  bfd *
> -symfile_bfd_open (char *name)
> +symfile_bfd_open (char *name, bfd_format format)
>  {
>    bfd *sym_bfd;
>    int desc;
> @@ -1126,7 +1189,7 @@
>      }
>    sym_bfd->cacheable = 1;
> 
> -  if (!bfd_check_format (sym_bfd, bfd_object))
> +  if (!bfd_check_format (sym_bfd, format))
>      {
>        /* FIXME: should be checking for errors from bfd_close (for one thing,
>           on error it does not free all the storage associated with the
> Index: gdb/symfile.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/symfile.h,v
> retrieving revision 1.12.2.1
> diff -u -r1.12.2.1 symfile.h
> --- gdb/symfile.h       16 Jun 2002 14:13:59 -0000      1.12.2.1
> +++ gdb/symfile.h       22 Aug 2002 20:23:17 -0000
> @@ -250,7 +250,7 @@
> 
>  extern void find_lowest_section (bfd *, asection *, PTR);
> 
> -extern bfd *symfile_bfd_open (char *);
> +extern bfd *symfile_bfd_open (char *, bfd_format);
> 
>  extern int get_section_index (struct objfile *, char *);
> 
> Index: gdb/xfreemod.c
> ===================================================================
> RCS file: gdb/xfreemod.c
> diff -N gdb/xfreemod.c
> --- /dev/null   1 Jan 1970 00:00:00 -0000
> +++ gdb/xfreemod.c      22 Aug 2002 20:23:17 -0000
> @@ -0,0 +1,308 @@
> +/* Handle XFree dynamically loaded modules
> +
> +This file is not an official part of GDB.
> +
> +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
> +the Free Software Foundation; either version 2 of the License, or
> +(at your option) any later version.
> +
> +This program is distributed in the hope that it will be useful,
> +but WITHOUT ANY WARRANTY; without even the implied warranty of
> +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +GNU General Public License for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with this program; if not, write to the Free Software
> +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
> +
> +#include "defs.h"
> +
> +#include "symtab.h"
> +#include "bfd.h"
> +#include "symfile.h"
> +#include "objfiles.h"
> +#include "gdbcore.h"
> +#include "gdb-stabs.h"
> +#include "target.h"
> +#include "breakpoint.h"
> +#include "language.h"
> +#include "command.h"
> +#include "gdb_regex.h"
> +
> +/* The XFree server has its own dynamic load mechanism. Unlike shared
> + * libraries it loads regular .o (or even .a) files. GDB support for
> + * tracking loaded modules is very similar to shared libraries however
> + * (in fact much of this code originated in solib.c).
> + *
> + * There are a few differences. We don't need to do very much in the
> + * create_inferior hook as no modules are loaded at that point so we
> + * just tidy up after the last run, tell the inferior that we're
> + * around and insert a breakpoint so we get chance to do something
> + * when a module is loaded.
> + *
> + */
> +
> +static char *xfreemod_break_names[] = {
> +  "_loader_debug_state",
> +  NULL
> +};
> +
> +#define MOD_LIST "ModList"
> +
> +static struct mod_list *mod_list_head; /* List of known modules */
> +
> +/* Called when the inferior starts, just after the shared library hook */
> +void xfreemod_create_inferior_hook(void)
> +{
> +  struct mod_list *mod;
> +  struct mod_list *next_mod;
> +  struct minimal_symbol *msymbol;
> +  char **bkpt_namep;
> +
> +  /* First, remove any existing breakpoints.  Their addresses
> +     may have changed since the last time we ran the program.  */
> +  remove_xfreemod_event_breakpoints ();
> +
> +  /* And our copy of the inferior's modules */
> +  for (mod = mod_list_head; mod; mod = next_mod)
> +  {
> +      next_mod = mod->next;
> +      free(mod);
> +  }
> +  mod_list_head = 0;
> +
> +  msymbol = lookup_minimal_symbol ("DebuggerPresent", NULL, symfile_objfile);
> +  if (msymbol)
> +  {
> +      char flag = 1;
> +
> +      int status = target_write_memory (SYMBOL_VALUE_ADDRESS (msymbol),
> +                                       &flag,
> +                                       sizeof(flag));
> +  }
> +
> +  /* Scan through the list of symbols, trying to look up the symbol and
> +     set a breakpoint there. */
> +  for (bkpt_namep = xfreemod_break_names; *bkpt_namep != NULL; bkpt_namep++)
> +  {
> +    msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile);
> +    if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0))
> +    {
> +      create_xfreemod_event_breakpoint (SYMBOL_VALUE_ADDRESS (msymbol));
> +    }
> +  }
> +}
> +
> +/* Common symbols are not given addresses until the final link - which
> + * in this case is when the module is loaded so we need to read the
> + * addresses for these symbols from the inferior.
> + */
> +void add_common_symbols (struct mod_list *mod)
> +{
> +  LDRCommonPtr commons;
> +  int i;
> +  int status;
> +
> +  if (mod->commonslen)
> +  {
> +    init_minimal_symbol_collection ();
> +    make_cleanup_discard_minimal_symbols ();
> +
> +    commons = xmalloc (mod->commonslen * sizeof(LDRCommon));
> +
> +    status = target_read_memory (mod->commons,
> +                                (char *)commons,
> +                                mod->commonslen * sizeof(LDRCommon));
> +    for (i = 0; i <mod->commonslen; i++)
> +    {
> +      char *name = xmalloc(commons[i].namelen + 1);
> +      status = target_read_memory ((CORE_ADDR)commons[i].name,
> +                         name,
> +                         commons[i].namelen + 1);
> +      prim_record_minimal_symbol (name, (CORE_ADDR)commons[i].addr,
> +                                 mst_bss, mod->objfile);
> +      free(name);
> +    }
> +    install_minimal_symbols (mod->objfile);
> +    free(commons);
> +  }
> +}
> +
> +
> +/* Read the list of loaded modules from the inferior and add any new
> + * ones to our local copy
> + */
> +void add_modules(int from_tty)
> +{
> +  struct minimal_symbol *msymbol;
> +  CORE_ADDR modrec_addr = 0;
> +  LDRModuleRec ldr_rec;
> +  char *mod_name;
> +  struct mod_list *mod;
> +
> +  msymbol = lookup_minimal_symbol (MOD_LIST, NULL, symfile_objfile);
> +  if (msymbol)
> +  {
> +    int status = target_read_memory (SYMBOL_VALUE_ADDRESS (msymbol),
> +                                    (char *)&modrec_addr,
> +                                    sizeof (CORE_ADDR));
> +    while(modrec_addr != 0)
> +    {
> +      status = target_read_memory (modrec_addr,
> +                                  (char *)&ldr_rec,
> +                                  sizeof (LDRModuleRec));
> +      mod_name = xmalloc (ldr_rec.namelen + 1);
> +      status = target_read_memory ((CORE_ADDR)ldr_rec.name,
> +                                  mod_name,
> +                                  ldr_rec.namelen + 1);
> +
> +      for (mod = mod_list_head; mod; mod = mod->next)
> +      {
> +         if (strcmp(mod_name, mod->mod_name) == 0)
> +             break;
> +      }
> +      if (!mod)
> +      {
> +         mod = xmalloc(sizeof(struct mod_list));
> +         mod->mod_name = mod_name;
> +         mod->symbols_loaded = 0;
> +         mod->objfile = 0;
> +         mod->from_tty = from_tty;
> +         mod->text_addr = (CORE_ADDR)ldr_rec.text;
> +         mod->data_addr = (CORE_ADDR)ldr_rec.data;
> +         mod->rodata_addr = (CORE_ADDR)ldr_rec.rodata;
> +         mod->bss_addr = (CORE_ADDR)ldr_rec.bss;
> +         mod->commons = (CORE_ADDR)ldr_rec.commons;
> +         mod->commonslen = ldr_rec.commonslen;
> +         mod->next = mod_list_head;
> +         mod_list_head = mod;
> +
> +      } else
> +      {
> +         free(mod_name);
> +      }
> +      modrec_addr = (CORE_ADDR)ldr_rec.next;
> +    }
> +  }
> +}
> +
> +/* A small stub to get us past the arg-passing pinhole of catch_errors.  */
> +static int module_add_stub (char *arg)
> +{
> +    struct mod_list *mod = (struct mod_list *) arg;
> +    struct section_addr_info text_addr;
> +
> +    memset(&text_addr, '\0', sizeof(text_addr));
> +    text_addr.other[0].name = ".text";
> +    text_addr.other[0].addr = mod->text_addr;
> +    text_addr.other[1].name = ".data";
> +    text_addr.other[1].addr = mod->data_addr;
> +    text_addr.other[2].name = ".rodata";
> +    text_addr.other[2].addr = mod->rodata_addr;
> +    text_addr.other[3].name = ".bss";
> +    text_addr.other[3].addr = mod->bss_addr;
> +
> +    mod->objfile = symbol_file_add (mod->mod_name, mod->from_tty,
> +                                    &text_addr, 0, OBJF_SHARED);
> +    return (1);
> +}
> +
> +void
> +xfreemod_add (arg_string, from_tty, target)
> +char *arg_string;
> +int from_tty;
> +struct target_ops *target;
> +{
> +  struct mod_list *mod;
> +  char *re_err;
> +
> +  if ((re_err = re_comp (arg_string ? arg_string : ".")) != NULL)
> +  {
> +    error ("Invalid regexp: %s", re_err);
> +  }
> +
> +  add_modules(from_tty);
> +  for (mod = mod_list_head; mod; mod = mod->next)
> +    if (mod->mod_name[0] && re_exec (mod->mod_name))
> +    {
> +      mod->from_tty = from_tty;
> +      if (mod->symbols_loaded)
> +      {
> +       if (from_tty)
> +       {
> +         printf_unfiltered ("Symbols already loaded for %s\n", mod->mod_name);
> +       }
> +      }
> +      else
> +      {
> +       mod->being_read = 1;
> +       if ((mod->symbols_loaded =
> +            catch_errors((catch_errors_ftype *)module_add_stub, (char *) mod,
> +            "Error while reading server module symbols:\n",
> +            RETURN_MASK_ALL)))
> +         add_common_symbols(mod);
> +       mod->being_read = 0;
> +      }
> +    }
> +}
> +
> +/* Request reading of module's symbols */
> +static void module_command (char *args, int from_tty)
> +{
> +  dont_repeat ();
> +  xfreemod_add(args, from_tty, (struct target_ops *) 0);
> +}
> +
> +/* List currently known modules and the status of each */
> +static void info_modules_command (char *ignore, int from_tty)
> +{
> +  struct mod_list *mod;
> +  int header_done = 0;
> +  int addr_width;
> +  char *addr_fmt;
> +
> +  if (exec_bfd == NULL)
> +  {
> +    printf_unfiltered ("No exec file.\n");
> +    return;
> +  }
> +
> +#ifndef TARGET_ELF64
> +  addr_width = 8+4;
> +  addr_fmt = "08l";
> +#else
> +  addr_width = 16+4;
> +  addr_fmt = "016l";
> +#endif
> +
> +  for (mod = mod_list_head; mod; mod = mod->next)
> +  {
> +    if (!header_done)
> +    {
> +      printf_unfiltered("%-*s%-*s%-12s%s\n", addr_width, "Text",
> +                       addr_width, "Data", "Syms Read",
> +                       "Module File");
> +      header_done++;
> +    }
> +    printf_unfiltered ("%-*s", addr_width,
> +                      local_hex_string_custom (mod->text_addr, addr_fmt));
> +    printf_unfiltered ("%-*s", addr_width,
> +                      local_hex_string_custom (mod->data_addr, addr_fmt));
> +    printf_unfiltered ("%-12s", mod->symbols_loaded ? "Yes" : "No");
> +    printf_unfiltered ("%s\n",  mod->mod_name);
> +  }
> +  if (mod_list_head == NULL)
> +  {
> +    printf_unfiltered ("No modules loaded at this time.\n");
> +  }
> +}
> +
> +void
> +_initialize_xfreemod(void)
> +{
> +  add_com ("module", class_files, module_command,
> +          "Load shared object library symbols for files matching REGEXP.");
> +  add_info ("modules", info_modules_command,
> +           "Status of loaded shared object libraries.");
> +}
> Index: gdb/xfreemod.h
> ===================================================================
> RCS file: gdb/xfreemod.h
> diff -N gdb/xfreemod.h
> --- /dev/null   1 Jan 1970 00:00:00 -0000
> +++ gdb/xfreemod.h      22 Aug 2002 20:23:17 -0000
> @@ -0,0 +1,69 @@
> +/* Handle XFree dynamically loaded modules
> +
> +This file is not an official part of GDB.
> +
> +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
> +the Free Software Foundation; either version 2 of the License, or
> +(at your option) any later version.
> +
> +This program is distributed in the hope that it will be useful,
> +but WITHOUT ANY WARRANTY; without even the implied warranty of
> +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +GNU General Public License for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with this program; if not, write to the Free Software
> +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
> +
> +#include <sys/types.h>
> +
> +#ifndef SOLIB_ADD
> +#error  XFree module support requires shared library support
> +#endif
> +
> +#define XFREE_MODULE_SUPPORT
> +
> +#ifdef __STDC__                /* Forward decl's for prototypes */
> +struct target_ops;
> +#endif
> +
> +/* XFree loader Interface to GDB */
> +typedef        struct {
> +       unsigned char *name;       /* Name of this symbol */
> +       unsigned int  namelen;     /* Name of this module */
> +       void          *addr;       /* Start address of the .text section */
> +} LDRCommon, *LDRCommonPtr;
> +
> +typedef        struct {
> +       unsigned int  version;     /* Version of this struct */
> +       unsigned char *name;       /* Name of this module */
> +       unsigned int  namelen;     /* Length of name */
> +       void          *text;       /* Start address of the .text section */
> +       void          *data;       /* Start address of the .data section */
> +       void          *rodata;     /* Start address of the .rodata section */
> +       void          *bss;        /* Start address of the .bss section */
> +        LDRCommonPtr  commons;     /* List of commmon symbols */
> +        int           commonslen;  /* Number of common symbols */
> +       struct LDRModuleRec *next; /* Next module record in chain */
> +} LDRModuleRec, *LDRModulePtr;
> +
> +/* Local copy of above */
> +struct mod_list {
> +    struct mod_list *next;     /* next structure in linked list */
> +    char *mod_name;            /* module name */
> +    char symbols_loaded;       /* flag: symbols read in yet? */
> +    char from_tty;             /* flag: print msgs? */
> +    struct objfile *objfile;   /* objfile for loaded module */
> +    CORE_ADDR text_addr;       /* Address at which text was loaded */
> +    CORE_ADDR data_addr;       /* Address at which data was loaded */
> +    CORE_ADDR rodata_addr;     /* Address at which read-only data was loaded */
> +    CORE_ADDR bss_addr;                /* Address at which bss was loaded */
> +    CORE_ADDR commons;         /* List of commmon symbols */
> +    int commonslen;            /* Number of common symbols */
> +    int being_read;             /* Somewhat hacky, used to identify module for offsets */
> +};
> +
> +extern void xfreemod_create_inferior_hook();
> +extern void xfreemod_add PARAMS ((char *, int, struct target_ops *));
> +
> Index: gdb/config/i386/fbsd.mh
> ===================================================================
> RCS file: /cvs/src/src/gdb/config/i386/fbsd.mh,v
> retrieving revision 1.10
> diff -u -r1.10 fbsd.mh
> --- gdb/config/i386/fbsd.mh     18 Jan 2002 04:50:59 -0000      1.10
> +++ gdb/config/i386/fbsd.mh     22 Aug 2002 20:23:17 -0000
> @@ -4,4 +4,4 @@
> 
>  NAT_FILE= nm-fbsd.h
>  # NOTE: Do not spread NATDEPFILES over several lines - it hurts BSD make.
> -NATDEPFILES= fork-child.o infptrace.o inftarg.o solib.o solib-svr4.o solib-legacy.o corelow.o core-aout.o core-regset.o i386-nat.o i387-nat.o i386bsd-nat.o i386fbsd-nat.o
> +NATDEPFILES= fork-child.o infptrace.o inftarg.o solib.o solib-svr4.o solib-legacy.o corelow.o core-aout.o core-regset.o i386-nat.o i387-nat.o i386bsd-nat.o i386fbsd-nat.o xfreemod.o
> Index: gdb/config/i386/linux.mh
> ===================================================================
> RCS file: /cvs/src/src/gdb/config/i386/linux.mh,v
> retrieving revision 1.11
> diff -u -r1.11 linux.mh
> --- gdb/config/i386/linux.mh    18 Jan 2002 04:50:59 -0000      1.11
> +++ gdb/config/i386/linux.mh    22 Aug 2002 20:23:17 -0000
> @@ -5,7 +5,7 @@
>  NAT_FILE= nm-linux.h
>  NATDEPFILES= infptrace.o inftarg.o fork-child.o corelow.o linux-proc.o \
>         core-aout.o i386-nat.o i386-linux-nat.o i387-nat.o \
> -       proc-service.o thread-db.o lin-lwp.o linux-proc.o gcore.o
> +       proc-service.o thread-db.o lin-lwp.o linux-proc.o gcore.o xfreemod.o
> 
>  # The dynamically loaded libthread_db needs access to symbols in the
>  # gdb executable.
> Index: gdb/config/i386/nbsd.mh
> ===================================================================
> RCS file: /cvs/src/src/gdb/config/i386/Attic/nbsd.mh,v
> retrieving revision 1.12
> diff -u -r1.12 nbsd.mh
> --- gdb/config/i386/nbsd.mh     18 Jan 2002 04:50:59 -0000      1.12
> +++ gdb/config/i386/nbsd.mh     22 Aug 2002 20:23:17 -0000
> @@ -6,7 +6,7 @@
>  # continuation character (backslash) to extend a commented line.  As a
>  # consequence, BSD make considers subsequent tab-indented lines to be
>  # "unassociated shell commands".
> -NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o i387-nat.o i386bsd-nat.o i386nbsd-nat.o solib.o solib-sunos.o
> +NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o i387-nat.o i386bsd-nat.o i386nbsd-nat.o solib.o solib-sunos.o xfreemod.o
> 
>  XM_FILE= xm-nbsd.h
>  NAT_FILE= nm-nbsd.h
> Index: gdb/config/i386/nm-fbsd.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/config/i386/nm-fbsd.h,v
> retrieving revision 1.5.8.1
> diff -u -r1.5.8.1 nm-fbsd.h
> --- gdb/config/i386/nm-fbsd.h   28 Jun 2002 18:46:05 -0000      1.5.8.1
> +++ gdb/config/i386/nm-fbsd.h   22 Aug 2002 20:23:17 -0000
> @@ -91,6 +91,7 @@
>  #endif
> 
>  #include "solib.h"             /* Support for shared libraries. */
> +#include "xfreemod.h"          /* Support for XFree86 modules.   */
>  #ifdef SVR4_SHARED_LIBS
>  #include "elf/common.h"                /* Additional ELF shared library info. */
>  #endif
> Index: gdb/config/i386/nm-linux.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/config/i386/nm-linux.h,v
> retrieving revision 1.16
> diff -u -r1.16 nm-linux.h
> --- gdb/config/i386/nm-linux.h  24 Feb 2002 22:56:05 -0000      1.16
> +++ gdb/config/i386/nm-linux.h  22 Aug 2002 20:23:17 -0000
> @@ -1,3 +1,4 @@
> +#error gdb/config/i386/nm-linux.h
>  /* Native support for GNU/Linux x86.
> 
>     Copyright 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
> @@ -22,12 +23,14 @@
> 
>  #ifndef NM_LINUX_H
>  #define NM_LINUX_H
> +#error NM_LINUX_H
> 
>  /* GNU/Linux supports the i386 hardware debugging registers.  */
>  #define I386_USE_GENERIC_WATCHPOINTS
> 
>  #include "i386/nm-i386.h"
>  #include "nm-linux.h"
> +#include "xfreemod.h"          /* Support for XFree86 modules.   */
> 
>  /* Support for the user area.  */
> 
> Index: gdb/config/i386/nm-x86-64.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/config/i386/Attic/nm-x86-64.h,v
> retrieving revision 1.3.2.1
> diff -u -r1.3.2.1 nm-x86-64.h
> --- gdb/config/i386/nm-x86-64.h 10 Apr 2002 12:53:46 -0000      1.3.2.1
> +++ gdb/config/i386/nm-x86-64.h 22 Aug 2002 20:23:17 -0000
> @@ -24,6 +24,7 @@
>  #define NM_X86_64_H
> 
>  #include "nm-linux.h"
> +#include "xfreemod.h"          /* Support for XFree86 modules.   */
> 
>  #define I386_USE_GENERIC_WATCHPOINTS
>  #include "i386/nm-i386.h"
> Index: gdb/config/i386/x86-64linux.mh
> ===================================================================
> RCS file: /cvs/src/src/gdb/config/i386/x86-64linux.mh,v
> retrieving revision 1.5
> diff -u -r1.5 x86-64linux.mh
> --- gdb/config/i386/x86-64linux.mh      21 Feb 2002 12:48:36 -0000      1.5
> +++ gdb/config/i386/x86-64linux.mh      22 Aug 2002 20:23:17 -0000
> @@ -6,6 +6,6 @@
>  NATDEPFILES= infptrace.o inftarg.o fork-child.o corelow.o \
>         core-aout.o i386-nat.o x86-64-linux-nat.o \
>         i387-nat.o proc-service.o thread-db.o lin-lwp.o \
> -       linux-proc.o gcore.o
> +       linux-proc.o gcore.o xfreemod.o
> 
>  LOADLIBES = -ldl -rdynamic


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