#include "defs.h"
#include "bfd.h"
#include "xcoffsolib.h"
#include "inferior.h"
#include "gdbcmd.h"
#include "symfile.h"
#include "frame.h"
#include "gdb_regex.h"
char *
pc_load_segment_name (CORE_ADDR addr)
{
static char buffer[BUFSIZ];
struct vmap *vp = vmap;
buffer[0] = buffer[1] = '\0';
for (; vp; vp = vp->nxt)
if (vp->tstart <= addr && addr < vp->tend)
{
if (*vp->member)
{
buffer[0] = '(';
strcat (&buffer[1], vp->member);
strcat (buffer, ")");
}
strcat (buffer, vp->name);
return buffer;
}
return "(unknown load module)";
}
static void solib_info (char *, int);
static void sharedlibrary_command (char *pattern, int from_tty);
static void
solib_info (char *args, int from_tty)
{
struct vmap *vp = vmap;
if (inferior_pid)
xcoff_relocate_symtab (inferior_pid);
if (vp == NULL || vp->nxt == NULL)
{
printf_unfiltered ("No shared libraries loaded at this time.\n");
return;
}
vp = vp->nxt;
printf_unfiltered ("\
Text Range Data Range Syms Shared Object Library\n");
for (; vp != NULL; vp = vp->nxt)
{
printf_unfiltered ("0x%s-0x%s 0x%s-0x%s %s %s%s%s%s\n",
paddr (vp->tstart),paddr (vp->tend),
paddr (vp->dstart), paddr (vp->dend),
vp->loaded ? "Yes" : "No ",
*vp->member ? "(" : "",
vp->member,
*vp->member ? ") " : "",
vp->name);
}
}
static void
sharedlibrary_command (char *pattern, int from_tty)
{
dont_repeat ();
if (inferior_pid)
xcoff_relocate_symtab (inferior_pid);
if (pattern)
{
char *re_err = re_comp (pattern);
if (re_err)
error ("Invalid regexp: %s", re_err);
}
{
int any_matches = 0;
int loaded_any_symbols = 0;
struct vmap *vp = vmap;
if (!vp)
return;
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)
{
reinit_frame_cache ();
}
}
}
void
_initialize_solib (void)
{
add_com ("sharedlibrary", class_files, sharedlibrary_command,
"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);
}