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]

[RFC] WIP: Implement auto-solib-add for AIX


I am currently working on supporting auto-solib-add for AIX and get rid of the
obsolete and unused SOLIB_SYMBOLS_MANUAL stuff.

This is still work in progress, I will submit a proper RFA if you think that
these changes are useful.
In addition I'd also like to submit the following cleanups then, for which I 
have provided no patches yet:

	* config/rs6000/tm-rs6000.h (PC_LOAD_SEGMENT):  Move from here ...
	* config/rs6000/nm-rs6000.h:  ... to here, this is an AIX native
	feature.
	* config/powerpc/tm-macos.h, config/powerpc/tm-ppc-eabi.h,
	config/powerpc/tm-ppc-eabi.h, config/rs6000/tm-rs6000ly.h:
	Remove #undef PC_LOAD_SEGMENT.
	* config/powerpc/aix.mt, config/rs6000/aix4.mt, config/rs6000/rs6000.mt
	(TDEPFILES):  Move xcoffsolib.o from here ...
	* config/powerpc/aix.mh, config/rs6000/aix4.mh, config/rs6000/rs6000.mh
	(NATDEPFILES):  ... to here, xcoffsolib.o contains AIX native code
	only.
	* rs6000-tdep.c:  Remove #include xcoffsolib.h, no longer needed.
	* xcoffsolib.h (xcoff_relocate_symtab_hook):  Remove declaration.
	* rs6000-nat.c (_initialize_core_rs6000):  Remove setting of
	xcoff_relocate_symtab_hook, no longer needed.
	* xcoffsolib.c (solib_info, sharedlibrary_command):  Remove
	xcoff_relocate_symtab_hook indirection, call xcoff_relocate_symtab
	directly, as xcoffsolib.c is now compiled in native AIX configurations
	only.

An additional cleanup might be possible by moving all the code from
xcoffsolib.c to rs6000-nat.c and get rid of xcoffsolib.c altogether.

Comments, suggestions ?


	Add auto-solib-add support for AIX, remove obsolete and unused
	SOLIB_SYMBOLS_MANUAL code, cleanup of AIX shared library handling code.
	* rs6000-nat.c (vmap_symtab):  Do not try to modify offsets
	if symbols are not yet loaded.
	(vmap_add_symbols):  New function to add symbols for a vmap entry.
	(add_vmap):  Turn errors into warnings, return NULL vmap upon
	failure. Add symbols via vmap_add_symbols only if requested.
	(xcoff_relocate_core):  Allow debugging of core files without an
	executable file. Handle NULL returns from add_vmap gracefully.
	* xcoffsolib.c (solib_add):  Remove, no longer needed.
	(solib_info):  Do not check for new shared libraries if there is no
	inferior process.
	(sharedlibrary_command):  Made static.
	Do not check for new shared libraries if there is no inferior process.
	Add symbols for requested shared libraries via vmap_add_symbols.
	(_initialize_solib):  Add `set auto-solib-add' command.
	* xcoffsolib.h (vmap_add_symbols):  Add prototype declaration.

*** ./rs6000-nat.c.orig	Fri Sep 15 21:27:29 2000
--- ./rs6000-nat.c	Mon Oct  9 21:24:38 2000
***************
*** 605,610 ****
--- 605,613 ----
  	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);
  
***************
*** 632,637 ****
--- 635,657 ----
    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,673 ****
    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 ()));
  
    /* make sure we have an object file */
  
--- 686,696 ----
    else
      abfd = bfd_fdopenr (objname, gnutarget, fd);
    if (!abfd)
!     {
!       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,699 ****
  
        if (!last)
  	{
  	  bfd_close (abfd);
! 	  /* FIXME -- should be error */
! 	  warning ("\"%s\": member \"%s\" missing.", abfd->filename, mem);
! 	  return 0;
  	}
  
        if (!bfd_check_format (last, bfd_object))
  	{
! 	  bfd_close (last);	/* XXX???       */
! 	  goto obj_err;
  	}
  
        vp = map_vmap (last, abfd);
--- 707,724 ----
  
        if (!last)
  	{
+ 	  warning ("\"%s\": member \"%s\" missing.", objname, mem);
  	  bfd_close (abfd);
! 	  return NULL;
  	}
  
        if (!bfd_check_format (last, bfd_object))
  	{
! 	  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);
***************
*** 700,724 ****
      }
    else
      {
!     obj_err:
        bfd_close (abfd);
!       error ("\"%s\": not in executable format: %s.",
! 	     objname, bfd_errmsg (bfd_get_error ()));
!       /*NOTREACHED */
      }
    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
    return vp;
  }
  
--- 725,741 ----
      }
    else
      {
!       warning ("\"%s\": not in executable format: %s.",
! 	       objname, bfd_errmsg (bfd_get_error ()));
        bfd_close (abfd);
!       return NULL;
      }
    obj = allocate_objfile (vp->bfd, 0);
    vp->objfile = obj;
  
!   /* Always add symbols for the main objfile.  */
!   if (vp == vmap || auto_solib_add)
!     vmap_add_symbols (vp);
    return vp;
  }
  
***************
*** 987,995 ****
--- 1004,1014 ----
  
    /* FIXME, this restriction should not exist.  For now, though I'll
       avoid coredumps with error() pending a real fix.  */
+ #if 0
    if (vmap == NULL)
      error
        ("Can't debug a core file without an executable file (on the RS/6000)");
+ #endif
  
    ldinfo_sec = bfd_get_section_by_name (core_bfd, ".ldinfo");
    if (ldinfo_sec == NULL)
***************
*** 1036,1047 ****
  	ldi->l32.ldinfo_fd = -1;
  
        /* The first ldinfo is for the exec file, allocated elsewhere.  */
!       if (offset == 0)
  	vp = vmap;
        else
  	vp = add_vmap (ldi);
  
        offset += LDI_NEXT (ldi, arch64);
        vmap_secs (vp, ldi, arch64);
  
        /* Unless this is the exec file,
--- 1055,1070 ----
  	ldi->l32.ldinfo_fd = -1;
  
        /* The first ldinfo is for the exec file, allocated elsewhere.  */
!       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,
*** ./xcoffsolib.c.orig	Sat Aug  5 11:38:00 2000
--- ./xcoffsolib.c	Mon Oct  9 22:28:03 2000
***************
*** 19,34 ****
     Foundation, Inc., 59 Temple Place - Suite 330,
     Boston, MA 02111-1307, USA.  */
  
- #if 0
- #include <sys/types.h>
- #include <sys/ldr.h>
- #endif
- 
  #include "defs.h"
  #include "bfd.h"
  #include "xcoffsolib.h"
  #include "inferior.h"
! #include "command.h"
  
  /* 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
--- 19,31 ----
     Foundation, Inc., 59 Temple Place - Suite 330,
     Boston, MA 02111-1307, USA.  */
  
  #include "defs.h"
  #include "bfd.h"
  #include "xcoffsolib.h"
  #include "inferior.h"
! #include "gdbcmd.h"
! #include "symfile.h"
! #include "gdb_regex.h"
  
  /* 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
***************
*** 36,141 ****
  
  void (*xcoff_relocate_symtab_hook) (unsigned int) = NULL;
  
- #ifdef SOLIB_SYMBOLS_MANUAL
  
- extern struct symtab *current_source_symtab;
- extern int current_source_line;
- 
- /* The real work of adding a shared library file to the symtab and
-    the section list.  */
- 
- void
- solib_add (char *arg_string, int from_tty, struct target_ops *target)
- {
-   char *val;
-   struct vmap *vp = vmap;
-   struct objfile *obj;
-   struct symtab *saved_symtab;
-   int saved_line;
- 
-   int loaded = 0;		/* true if any shared obj loaded */
-   int matched = 0;		/* true if any shared obj matched */
- 
-   if (arg_string == 0)
-     re_comp (".");
-   else if (val = (char *) re_comp (arg_string))
-     {
-       error ("Invalid regexp: %s", val);
-     }
-   if (!vp || !vp->nxt)
-     return;
- 
-   /* save current symbol table and line number, in case they get changed
-      in symbol loading process. */
- 
-   saved_symtab = current_source_symtab;
-   saved_line = current_source_line;
- 
-   /* skip over the first vmap, it is the main program, always loaded. */
-   vp = vp->nxt;
- 
-   for (; vp; vp = vp->nxt)
-     {
- 
-       if (re_exec (vp->name) || (*vp->member && re_exec (vp->member)))
- 	{
- 
- 	  matched = 1;
- 
- 	  /* if already loaded, continue with the next one. */
- 	  if (vp->loaded)
- 	    {
- 
- 	      printf_unfiltered ("%s%s%s%s: already loaded.\n",
- 				 *vp->member ? "(" : "",
- 				 vp->member,
- 				 *vp->member ? ") " : "",
- 				 vp->name);
- 	      continue;
- 	    }
- 
- 	  printf_unfiltered ("Loading  %s%s%s%s...",
- 			     *vp->member ? "(" : "",
- 			     vp->member,
- 			     *vp->member ? ") " : "",
- 			     vp->name);
- 	  gdb_flush (gdb_stdout);
- 
- 	  /* 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
- 	     way solib.c (for SunOS/SVR4) does it.  */
- 	  obj = lookup_objfile_bfd (vp->bfd);
- 	  if (!obj)
- 	    {
- 	      warning ("\nObj structure for the shared object not found. Loading failed.");
- 	      continue;
- 	    }
- 
- 	  syms_from_objfile (obj, NULL, 0, 0);
- 	  new_symfile_objfile (obj, 0, 0);
- 	  vmap_symtab (vp);
- 	  printf_unfiltered ("Done.\n");
- 	  loaded = vp->loaded = 1;
- 	}
-     }
-   /* if any shared object is loaded, then misc_func_vector needs sorting. */
-   if (loaded)
-     {
- #if 0
-       sort_misc_function_vector ();
- #endif
-       current_source_symtab = saved_symtab;
-       current_source_line = saved_line;
- 
-       /* Getting new symbols might change our opinion about what is frameless.
-          Is this correct?? FIXME. */
- /*    reinit_frame_cache(); */
-     }
-   else if (!matched)
-     printf_unfiltered ("No matching shared object found.\n");
- }
- #endif /* SOLIB_SYMBOLS_MANUAL */
- 
  /* Return the module name of a given text address. Note that returned buffer
     is not persistent. */
  
--- 33,39 ----
***************
*** 162,167 ****
--- 60,66 ----
  }
  
  static void solib_info (char *, int);
+ static void sharedlibrary_command (char *pattern, int from_tty);
  
  static void
  solib_info (char *args, int from_tty)
***************
*** 169,175 ****
    struct vmap *vp = vmap;
  
    /* Check for new shared libraries loaded with load ().  */
!   if (xcoff_relocate_symtab_hook != NULL)
      (*xcoff_relocate_symtab_hook) (inferior_pid);
  
    if (vp == NULL || vp->nxt == NULL)
--- 68,74 ----
    struct vmap *vp = vmap;
  
    /* Check for new shared libraries loaded with load ().  */
!   if (inferior_pid && xcoff_relocate_symtab_hook != NULL)
      (*xcoff_relocate_symtab_hook) (inferior_pid);
  
    if (vp == NULL || vp->nxt == NULL)
***************
*** 197,214 ****
      }
  }
  
! void
! sharedlibrary_command (char *args, int from_tty)
  {
    dont_repeat ();
  
    /* Check for new shared libraries loaded with load ().  */
!   if (xcoff_relocate_symtab_hook != NULL)
      (*xcoff_relocate_symtab_hook) (inferior_pid);
  
! #ifdef SOLIB_SYMBOLS_MANUAL
!   solib_add (args, from_tty, (struct target_ops *) 0);
! #endif /* SOLIB_SYMBOLS_MANUAL */
  }
  
  void
--- 96,161 ----
      }
  }
  
! static void
! sharedlibrary_command (char *pattern, int from_tty)
  {
    dont_repeat ();
  
    /* Check for new shared libraries loaded with load ().  */
!   if (inferior_pid && xcoff_relocate_symtab_hook != NULL)
      (*xcoff_relocate_symtab_hook) (inferior_pid);
  
!   if (pattern)
!     {
!       char *re_err = re_comp (pattern);
! 
!       if (re_err)
! 	error ("Invalid regexp: %s", re_err);
!     }
! 
!   /* Walk the list of currently loaded shared libraries, and read
!      symbols for any that match the pattern --- or any whose symbols
!      aren't already loaded, if no pattern was given.  */
!   {
!     int any_matches = 0;
!     int loaded_any_symbols = 0;
!     struct vmap *vp = vmap;
! 
!     if (!vp)
!       return;
! 
!     /* skip over the first vmap, it is the main program, always loaded. */
!     for (vp = vp->nxt; vp; vp = vp->nxt)
!       if (! pattern
! 	    || re_exec (vp->name)
! 	    || (*vp->member && re_exec (vp->member)))
! 	{
! 	  any_matches = 1;
! 
! 	  if (vp->loaded)
! 	    {
! 	      if (from_tty)
! 		printf_unfiltered ("Symbols already loaded for %s\n",
! 				   vp->name);
! 	    }
! 	  else
! 	    {
! 	      if (vmap_add_symbols (vp))
! 		loaded_any_symbols = 1;
! 	    }
! 	}
! 
!     if (from_tty && pattern && ! any_matches)
!       printf_unfiltered
! 	("No loaded shared libraries match the pattern `%s'.\n", pattern);
! 
!     if (loaded_any_symbols)
!       {
! 	/* Getting new symbols may change our opinion about what is
! 	   frameless.  */
! 	reinit_frame_cache ();
!       }
!   }
  }
  
  void
***************
*** 218,221 ****
--- 165,179 ----
  	   "Load shared object library symbols for files matching REGEXP.");
    add_info ("sharedlibrary", solib_info,
  	    "Status of loaded shared object libraries");
+ 
+   add_show_from_set
+     (add_set_cmd ("auto-solib-add", class_support, var_zinteger,
+ 		  (char *) &auto_solib_add,
+ 		  "Set autoloading of shared library symbols.\n\
+ If nonzero, symbols from all shared object libraries will be loaded\n\
+ automatically when the inferior begins execution or when the dynamic linker\n\
+ informs gdb that a new library has been loaded.  Otherwise, symbols\n\
+ must be loaded manually, using `sharedlibrary'.",
+ 		  &setlist),
+      &showlist);
  }
*** ./xcoffsolib.h.orig	Sat Aug  5 11:38:01 2000
--- ./xcoffsolib.h	Sun Oct  8 19:00:25 2000
***************
*** 59,61 ****
--- 59,64 ----
  /* Hook for symbol table relocation at runtime. */
  
  extern void (*xcoff_relocate_symtab_hook) (unsigned int);
+ 
+ /* Add symbols for a vmap.  */
+ extern int vmap_add_symbols (struct vmap *vp);

-- 
Peter Schauer			pes@regent.e-technik.tu-muenchen.de

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