#include "symfile.h"
#include "objfiles.h"
#include "inferior.h"
+#include "gdb-stabs.h"
/* TODO:
- * Relocate data addresses in the shared library.
-
* Most of this code should work for hp300 shared libraries. Does
anyone care enough to weed out any SOM-isms.
asection *shlib_info;
int status;
unsigned int dld_flags;
- char buf[4];
+ char buf[4], *re_err;
+
+ /* First validate our arguments. */
+ if ((re_err = re_comp (arg_string ? arg_string : ".")) != NULL)
+ {
+ error ("Invalid regexp: %s", re_err);
+ }
/* If we're debugging a core file, or have attached to a running
process, then som_solib_create_inferior_hook will not have been
if (bfd_section_size (symfile_objfile->obfd, shlib_info) == 0)
return;
- msymbol = lookup_minimal_symbol ("__dld_flags", (struct objfile *) NULL);
+ msymbol = lookup_minimal_symbol ("__dld_flags", NULL, NULL);
if (msymbol == NULL)
{
error ("Unable to find __dld_flags symbol in object file.\n");
if ((dld_flags & 1) == 0)
warning ("The shared libraries were not privately mapped; setting a\nbreakpoint in a shared library will not work until you rerun the program.\n");
- msymbol = lookup_minimal_symbol ("__dld_list", (struct objfile *) NULL);
+ msymbol = lookup_minimal_symbol ("__dld_list", NULL, NULL);
if (!msymbol)
{
/* Older crt0.o files (hpux8) don't have __dld_list as a symbol,
but the data is still available if you know where to look. */
- msymbol = lookup_minimal_symbol ("__dld_flags", (struct objfile *)NULL);
+ msymbol = lookup_minimal_symbol ("__dld_flags", NULL, NULL);
if (!msymbol)
{
error ("Unable to find dynamic library list.\n");
addr = extract_unsigned_integer (buf, 4);
/* Now that we have a pointer to the dynamic library list, walk
- through it and add the symbols for each library.
-
- Skip the first entry since it's our executable. */
- status = target_read_memory (addr + 36, buf, 4);
- if (status != 0)
- goto err;
-
- addr = extract_unsigned_integer (buf, 4);
+ through it and add the symbols for each library. */
so_list_tail = so_list_head;
/* Find the end of the list of shared objects. */
unsigned int name_len;
char *name;
struct so_list *new_so;
+ struct so_list *so_list = so_list_head;
struct section_table *p;
if (addr == 0)
if (status != 0)
goto err;
+ /* See if we've already loaded something with this name. */
+ while (so_list)
+ {
+ if (!strcmp (so_list->som_solib.name, name))
+ break;
+ so_list = so_list->next;
+ }
+
+ /* We've already loaded this one or it's the main program, skip it. */
+ if (so_list || !strcmp (name, symfile_objfile->name))
+ {
+ status = target_read_memory (addr + 36, buf, 4);
+ if (status != 0)
+ goto err;
+
+ addr = (CORE_ADDR) extract_unsigned_integer (buf, 4);
+ continue;
+ }
+
name = obsavestring (name, name_len - 1,
&symfile_objfile->symbol_obstack);
addr = (CORE_ADDR)new_so->som_solib.next;
new_so->objfile = symbol_file_add (name, from_tty, text_addr, 0, 0, 0);
- new_so->abfd = bfd_openr (name, gnutarget);
- new_so->abfd->cacheable = true;
+ new_so->abfd = new_so->objfile->obfd;
if (!bfd_check_format (new_so->abfd, bfd_object))
{
status = target_read_memory (text_addr, buf, 4);
if (status != 0)
{
- int old;
+ int old, new;
+ new = new_so->sections_end - new_so->sections;
/* Add sections from the shared library to the core target. */
if (target->to_sections)
{
old = target->to_sections_end - target->to_sections;
target->to_sections = (struct section_table *)
xrealloc ((char *)target->to_sections,
- ((sizeof (struct section_table))
- * (old + bfd_count_sections (new_so->abfd))));
+ ((sizeof (struct section_table)) * (old + new)));
}
else
{
old = 0;
target->to_sections = (struct section_table *)
- xmalloc ((sizeof (struct section_table))
- * bfd_count_sections (new_so->abfd));
+ xmalloc ((sizeof (struct section_table)) * new);
}
- target->to_sections_end = (target->to_sections
- + old + bfd_count_sections (new_so->abfd));
+ target->to_sections_end = (target->to_sections + old + new);
memcpy ((char *)(target->to_sections + old),
new_so->sections,
- ((sizeof (struct section_table))
- * bfd_count_sections (new_so->abfd)));
+ ((sizeof (struct section_table)) * new));
}
}
/* Get the address of __dld_flags, if no such symbol exists, then we can
not debug the shared code. */
- msymbol = lookup_minimal_symbol ("__dld_flags", (struct objfile *) NULL);
+ msymbol = lookup_minimal_symbol ("__dld_flags", NULL, NULL);
if (msymbol == NULL)
{
error ("Unable to find __dld_flags symbol in object file.\n");
}
/* Now find the address of _start and set a breakpoint there. */
- msymbol = lookup_minimal_symbol ("_start", symfile_objfile);
+ msymbol = lookup_minimal_symbol ("_start", NULL, symfile_objfile);
if (msymbol == NULL)
{
error ("Unable to find _start symbol in object file.\n");
return got_value;
}
+int
+som_solib_section_offsets (objfile, offsets)
+ struct objfile *objfile;
+ struct section_offsets *offsets;
+{
+ struct so_list *so_list = so_list_head;
+
+ while (so_list)
+ {
+ /* Oh what a pain! We need the offsets before so_list->objfile
+ is valid. The BFDs will never match. Make a best guess. */
+ if (strstr (objfile->name, so_list->som_solib.name))
+ {
+ asection *private_section;
+
+ /* The text offset is easy. */
+ ANOFFSET (offsets, SECT_OFF_TEXT)
+ = (so_list->som_solib.text_addr
+ - so_list->som_solib.text_link_addr);
+ ANOFFSET (offsets, SECT_OFF_RODATA)
+ = ANOFFSET (offsets, SECT_OFF_TEXT);
+
+ /* We should look at presumed_dp in the SOM header, but
+ that's not easily available. This should be OK though. */
+ private_section = bfd_get_section_by_name (objfile->obfd,
+ "$PRIVATE$");
+ if (!private_section)
+ {
+ warning ("Unable to find $PRIVATE$ in shared library!");
+ ANOFFSET (offsets, SECT_OFF_DATA) = 0;
+ ANOFFSET (offsets, SECT_OFF_BSS) = 0;
+ return 1;
+ }
+ ANOFFSET (offsets, SECT_OFF_DATA)
+ = (so_list->som_solib.data_start - private_section->vma);
+ ANOFFSET (offsets, SECT_OFF_BSS)
+ = ANOFFSET (offsets, SECT_OFF_DATA);
+ return 1;
+ }
+ so_list = so_list->next;
+ }
+ return 0;
+}
+
/* Dump information about all the currently loaded shared libraries. */
static void
}
}
+static void
+som_solib_sharedlibrary_command (args, from_tty)
+ char *args;
+ int from_tty;
+{
+ dont_repeat ();
+ som_solib_add (args, from_tty, (struct target_ops *) 0);
+}
+
void
_initialize_som_solib ()
{
+ add_com ("sharedlibrary", class_files, som_solib_sharedlibrary_command,
+ "Load shared object library symbols for files matching REGEXP.");
add_info ("sharedlibrary", som_sharedlibrary_info_command,
"Status of loaded shared object libraries.");
}