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.
This commit is contained in:
Peter Schauer 2000-11-09 09:49:00 +00:00
parent c11c3a98c0
commit 63f58cc529
18 changed files with 178 additions and 177 deletions

View file

@ -1,3 +1,45 @@
2000-11-09 Peter Schauer <pes@regent.e-technik.tu-muenchen.de>
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 <cagney@b1.cygnus.com>
* MAINTAINERS: Specify the vax-dec-vms5.5 target tupple.

View file

@ -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.

View file

@ -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.

View file

@ -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

View file

@ -22,6 +22,3 @@
#include "rs6000/tm-rs6000.h"
#define GDB_TARGET_POWERPC
/* This is no use to us. */
#undef PC_LOAD_SEGMENT

View file

@ -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

View file

@ -26,7 +26,6 @@
#define GDB_TARGET_POWERPC
#undef PC_LOAD_SEGMENT
#undef PROCESS_LINENUMBER_HOOK
#endif /* TM_PPC_NW_H */

View file

@ -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.

View file

@ -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

View file

@ -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()

View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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 */

View file

@ -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);
}

View file

@ -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 */

View file

@ -19,122 +19,15 @@
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"
#include "gdbcmd.h"
#include "symfile.h"
#include "frame.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
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. */
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);
#ifdef SOLIB_SYMBOLS_MANUAL
solib_add (args, from_tty, (struct target_ops *) 0);
#endif /* SOLIB_SYMBOLS_MANUAL */
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,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);
}

View file

@ -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);