From 63f58cc52974c191fe73f2e32ca1178b1b9f31ed Mon Sep 17 00:00:00 2001 From: Peter Schauer Date: Thu, 9 Nov 2000 09:49:00 +0000 Subject: [PATCH] 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. * 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-nw.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. * Makefile.in: Update dependencies for rs6000-tdep.o, rs6000-nat.o and xcoffsolib.o. --- gdb/ChangeLog | 42 +++++++ gdb/Makefile.in | 7 +- gdb/config/powerpc/aix.mh | 3 +- gdb/config/powerpc/aix.mt | 2 +- gdb/config/powerpc/tm-macos.h | 3 - gdb/config/powerpc/tm-ppc-eabi.h | 1 - gdb/config/powerpc/tm-ppc-nw.h | 1 - gdb/config/rs6000/aix4.mh | 3 +- gdb/config/rs6000/aix4.mt | 2 +- gdb/config/rs6000/nm-rs6000.h | 5 + gdb/config/rs6000/rs6000.mh | 3 +- gdb/config/rs6000/rs6000.mt | 2 +- gdb/config/rs6000/tm-rs6000.h | 5 - gdb/config/rs6000/tm-rs6000ly.h | 2 - gdb/rs6000-nat.c | 75 +++++++----- gdb/rs6000-tdep.c | 1 - gdb/xcoffsolib.c | 193 ++++++++++++------------------- gdb/xcoffsolib.h | 5 +- 18 files changed, 178 insertions(+), 177 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9963c7076ee..8678a520f5e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,45 @@ +2000-11-09 Peter Schauer + + 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. + + * 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-nw.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. + * Makefile.in: Update dependencies for rs6000-tdep.o, rs6000-nat.o + and xcoffsolib.o. + Thu Nov 9 17:16:29 2000 Andrew Cagney * MAINTAINERS: Specify the vax-dec-vms5.5 target tupple. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index ff3d1695376..13ce825f733 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1801,10 +1801,10 @@ rom68k-rom.o: rom68k-rom.c monitor.h $(bfd_h) gdb_wait.h $(defs_h) $(gdbcmd_h) \ $(inferior_h) target.h serial.h terminal.h rs6000-nat.o: rs6000-nat.c $(bfd_h) $(defs_h) $(inferior_h) target.h \ - xcoffsolib.h + $(gdbcore_h) xcoffsolib.h symfile.h objfiles.h gdb-stabs.h rs6000-tdep.o: rs6000-tdep.c $(defs_h) $(gdbcore_h) $(inferior_h) \ - target.h xcoffsolib.h ppc-tdep.h + target.h ppc-tdep.h scm-exp.o: $(defs_h) $(value_h) parser-defs.h language.h c-lang.h \ scm-lang.h scm-tags.h @@ -1967,7 +1967,8 @@ xcoffread.o: xcoffread.c $(bfd_h) $(INCLUDE_DIR)/aout/stab.def \ complaints.h $(defs_h) $(gdbtypes_h) objfiles.h stabsread.h symfile.h \ $(symtab_h) partial-stab.h gdb_string.h -xcoffsolib.o: xcoffsolib.c $(bfd_h) $(defs_h) xcoffsolib.h +xcoffsolib.o: xcoffsolib.c $(bfd_h) $(defs_h) xcoffsolib.h $(inferior_h) \ + $(gdbcmd_h) symfile.h $(frame_h) gnu-regex.h # FIXME: z8k-tdep.c calls _initialize_gdbtypes(). Since that isn't # declared -Wimplicit fails. It should be using the GDBARCH framework. diff --git a/gdb/config/powerpc/aix.mh b/gdb/config/powerpc/aix.mh index ba3e0c270f2..30e4080c937 100644 --- a/gdb/config/powerpc/aix.mh +++ b/gdb/config/powerpc/aix.mh @@ -4,7 +4,8 @@ XM_FILE= xm-aix.h XDEPFILES= NAT_FILE= nm-aix.h -NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o rs6000-nat.o xcoffread.o +NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o rs6000-nat.o \ + xcoffread.o xcoffsolib.o # When compiled with cc, for debugging, this argument should be passed. # We have no idea who our current compiler is though, so we skip it. diff --git a/gdb/config/powerpc/aix.mt b/gdb/config/powerpc/aix.mt index 38436ee89af..985f71bd554 100644 --- a/gdb/config/powerpc/aix.mt +++ b/gdb/config/powerpc/aix.mt @@ -1,3 +1,3 @@ # Target: PowerPC running AIX -TDEPFILES= rs6000-tdep.o xcoffsolib.o ppc-linux-tdep.o +TDEPFILES= rs6000-tdep.o ppc-linux-tdep.o TM_FILE= tm-ppc-aix.h diff --git a/gdb/config/powerpc/tm-macos.h b/gdb/config/powerpc/tm-macos.h index bfd7a73f726..1cb50500ed2 100644 --- a/gdb/config/powerpc/tm-macos.h +++ b/gdb/config/powerpc/tm-macos.h @@ -22,6 +22,3 @@ #include "rs6000/tm-rs6000.h" #define GDB_TARGET_POWERPC - -/* This is no use to us. */ -#undef PC_LOAD_SEGMENT diff --git a/gdb/config/powerpc/tm-ppc-eabi.h b/gdb/config/powerpc/tm-ppc-eabi.h index 57e056bf0df..aef54dcac5a 100644 --- a/gdb/config/powerpc/tm-ppc-eabi.h +++ b/gdb/config/powerpc/tm-ppc-eabi.h @@ -30,7 +30,6 @@ #undef DEFAULT_LR_SAVE #define DEFAULT_LR_SAVE 4 /* eabi saves LR at 4 off of SP */ -#undef PC_LOAD_SEGMENT #undef PROCESS_LINENUMBER_HOOK #undef TEXT_SEGMENT_BASE diff --git a/gdb/config/powerpc/tm-ppc-nw.h b/gdb/config/powerpc/tm-ppc-nw.h index 7306ea00d7c..32a58f4d58b 100644 --- a/gdb/config/powerpc/tm-ppc-nw.h +++ b/gdb/config/powerpc/tm-ppc-nw.h @@ -26,7 +26,6 @@ #define GDB_TARGET_POWERPC -#undef PC_LOAD_SEGMENT #undef PROCESS_LINENUMBER_HOOK #endif /* TM_PPC_NW_H */ diff --git a/gdb/config/rs6000/aix4.mh b/gdb/config/rs6000/aix4.mh index c5bc2dae91f..8d105d9a21f 100644 --- a/gdb/config/rs6000/aix4.mh +++ b/gdb/config/rs6000/aix4.mh @@ -4,7 +4,8 @@ XM_FILE= xm-aix4.h XDEPFILES= NAT_FILE= nm-rs6000.h -NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o rs6000-nat.o +NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o rs6000-nat.o \ + xcoffsolib.o # When compiled with cc, for debugging, this argument should be passed. # We have no idea who our current compiler is though, so we skip it. diff --git a/gdb/config/rs6000/aix4.mt b/gdb/config/rs6000/aix4.mt index d602415847d..f1082b3a4b2 100644 --- a/gdb/config/rs6000/aix4.mt +++ b/gdb/config/rs6000/aix4.mt @@ -1,3 +1,3 @@ # Target: IBM RS/6000 running AIX4 -TDEPFILES= rs6000-tdep.o xcoffsolib.o xcoffread.o ppc-linux-tdep.o +TDEPFILES= rs6000-tdep.o xcoffread.o ppc-linux-tdep.o TM_FILE= tm-rs6000-aix4.h diff --git a/gdb/config/rs6000/nm-rs6000.h b/gdb/config/rs6000/nm-rs6000.h index 66a8652a813..d405aecbffb 100644 --- a/gdb/config/rs6000/nm-rs6000.h +++ b/gdb/config/rs6000/nm-rs6000.h @@ -57,6 +57,11 @@ extern void xcoff_relocate_symtab (unsigned int); struct target_ops; extern void xcoff_relocate_core (struct target_ops *); +/* Load segment of a given pc value. */ + +#define PC_LOAD_SEGMENT(PC) pc_load_segment_name(PC) +extern char *pc_load_segment_name (CORE_ADDR); + /* Return sizeof user struct to callers in less machine dependent routines */ #define KERNEL_U_SIZE kernel_u_size() diff --git a/gdb/config/rs6000/rs6000.mh b/gdb/config/rs6000/rs6000.mh index 600d616124c..ec877e77bae 100644 --- a/gdb/config/rs6000/rs6000.mh +++ b/gdb/config/rs6000/rs6000.mh @@ -4,7 +4,8 @@ XM_FILE= xm-rs6000.h XDEPFILES= NAT_FILE= nm-rs6000.h -NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o rs6000-nat.o +NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o rs6000-nat.o \ + xcoffsolib.o # When compiled with cc, for debugging, this argument should be passed. # We have no idea who our current compiler is though, so we skip it. diff --git a/gdb/config/rs6000/rs6000.mt b/gdb/config/rs6000/rs6000.mt index 941ad328aac..a9afe894955 100644 --- a/gdb/config/rs6000/rs6000.mt +++ b/gdb/config/rs6000/rs6000.mt @@ -1,3 +1,3 @@ # Target: IBM RS/6000 running AIX -TDEPFILES= rs6000-tdep.o xcoffsolib.o xcoffread.o ppc-linux-tdep.o +TDEPFILES= rs6000-tdep.o xcoffread.o ppc-linux-tdep.o TM_FILE= tm-rs6000.h diff --git a/gdb/config/rs6000/tm-rs6000.h b/gdb/config/rs6000/tm-rs6000.h index beb445d72c8..6ed29557243 100644 --- a/gdb/config/rs6000/tm-rs6000.h +++ b/gdb/config/rs6000/tm-rs6000.h @@ -26,11 +26,6 @@ #define TEXT_SEGMENT_BASE 0x10000000 -/* Load segment of a given pc value. */ - -#define PC_LOAD_SEGMENT(PC) pc_load_segment_name(PC) -extern char *pc_load_segment_name (CORE_ADDR); - /* AIX's assembler doesn't grok dollar signs in identifiers. So we use dots instead. This item must be coordinated with G++. */ #undef CPLUS_MARKER diff --git a/gdb/config/rs6000/tm-rs6000ly.h b/gdb/config/rs6000/tm-rs6000ly.h index ce555139c85..7dd57a41fe2 100644 --- a/gdb/config/rs6000/tm-rs6000ly.h +++ b/gdb/config/rs6000/tm-rs6000ly.h @@ -26,8 +26,6 @@ /* Use generic RS6000 definitions. */ #include "rs6000/tm-rs6000.h" -#undef PC_LOAD_SEGMENT - #define CANNOT_STORE_REGISTER(regno) (regno == PS_REGNUM) #endif /* TM_RS6000LYNX_H */ diff --git a/gdb/rs6000-nat.c b/gdb/rs6000-nat.c index 6fa4560703f..f44d0c10e98 100644 --- a/gdb/rs6000-nat.c +++ b/gdb/rs6000-nat.c @@ -605,6 +605,9 @@ 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); @@ -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; } @@ -985,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) { @@ -1036,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, @@ -1125,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); } diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c index 252ea777873..a2b043c6134 100644 --- a/gdb/rs6000-tdep.c +++ b/gdb/rs6000-tdep.c @@ -28,7 +28,6 @@ #include "gdbcmd.h" #include "symfile.h" #include "objfiles.h" -#include "xcoffsolib.h" #include "arch-utils.h" #include "bfd/libbfd.h" /* for bfd_default_set_arch_mach */ diff --git a/gdb/xcoffsolib.c b/gdb/xcoffsolib.c index 84b46eecdff..3876a426239 100644 --- a/gdb/xcoffsolib.c +++ b/gdb/xcoffsolib.c @@ -19,122 +19,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#if 0 -#include -#include -#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 - NULL and never called. */ - -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. */ +#include "gdbcmd.h" +#include "symfile.h" +#include "frame.h" +#include "gdb_regex.h" - 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. */ @@ -162,6 +55,7 @@ pc_load_segment_name (CORE_ADDR addr) } 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,8 +63,8 @@ solib_info (char *args, int from_tty) 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 (inferior_pid) + xcoff_relocate_symtab (inferior_pid); if (vp == NULL || vp->nxt == NULL) { @@ -197,18 +91,66 @@ Text Range Data Range Syms Shared Object Library\n"); } } -void -sharedlibrary_command (char *args, int from_tty) +static void +sharedlibrary_command (char *pattern, 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); + if (inferior_pid) + xcoff_relocate_symtab (inferior_pid); + + if (pattern) + { + char *re_err = re_comp (pattern); -#ifdef SOLIB_SYMBOLS_MANUAL - solib_add (args, from_tty, (struct target_ops *) 0); -#endif /* SOLIB_SYMBOLS_MANUAL */ + 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,4 +160,15 @@ _initialize_solib (void) "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); } diff --git a/gdb/xcoffsolib.h b/gdb/xcoffsolib.h index fbd3d5b86cd..b8af8d4bb14 100644 --- a/gdb/xcoffsolib.h +++ b/gdb/xcoffsolib.h @@ -56,6 +56,5 @@ struct vmap_and_bfd extern struct vmap *vmap; -/* 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); -- 2.30.2