*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / pa64solib.c
index 441095e92a76a4032a9aa0c0c81a7a99460032a0..0bb3de8c8a31e07b414753f471709bac7d9fc63b 100644 (file)
@@ -1,5 +1,7 @@
 /* Handle HP ELF shared libraries for GDB, the GNU Debugger.
-   Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
+
+   Copyright 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation,
+   Inc.
 
    This file is part of GDB.
 
 #include "gdb-stabs.h"
 #include "gdb_stat.h"
 #include "gdbcmd.h"
-#include "assert.h"
 #include "language.h"
 #include "regcache.h"
+#include "exec.h"
+#include "hppa-tdep.h"
 
 #include <fcntl.h>
 
@@ -57,9 +60,6 @@
 #define O_BINARY 0
 #endif
 
-/* Defined in exec.c; used to prevent dangling pointer bug.  */
-extern struct target_ops exec_ops;
-
 static CORE_ADDR bfd_lookup_symbol (bfd *, char *);
 /* This lives in hppa-tdep.c. */
 extern struct unwind_table_entry *find_unwind_entry (CORE_ADDR pc);
@@ -80,7 +80,7 @@ struct so_list
     struct load_module_desc pa64_solib_desc;
     struct section_table *sections;
     struct section_table *sections_end;
-    boolean loaded;
+    int loaded;
   };
 
 static struct so_list *so_list_head;
@@ -109,10 +109,10 @@ static int pa64_solib_st_size_threshold_exceeded;
 typedef struct
   {
     CORE_ADDR dld_flags_addr;
-    long long dld_flags;
-    sec_ptr dyninfo_sect;
-    boolean have_read_dld_descriptor;
-    boolean is_valid;
+    LONGEST dld_flags;
+    struct bfd_section *dyninfo_sect;
+    int have_read_dld_descriptor;
+    int is_valid;
     CORE_ADDR load_map;
     CORE_ADDR load_map_addr;
     struct load_module_desc dld_desc;
@@ -127,11 +127,11 @@ static void pa64_solib_sharedlibrary_command (char *, int);
 
 static void *pa64_target_read_memory (void *, CORE_ADDR, size_t, int);
 
-static boolean read_dld_descriptor (struct target_ops *);
+static int read_dld_descriptor (struct target_ops *, int readsyms);
 
-static boolean read_dynamic_info (asection *, dld_cache_t *);
+static int read_dynamic_info (asection *, dld_cache_t *);
 
-static void add_to_solist (boolean, char *, struct load_module_desc *,
+static void add_to_solist (int, char *, int, struct load_module_desc *,
                           CORE_ADDR, struct target_ops *);
 
 /* When examining the shared library for debugging information we have to
@@ -221,10 +221,10 @@ pa64_solib_add_solib_objfile (struct so_list *so, char *name, int from_tty,
 {
   bfd *tmp_bfd;
   asection *sec;
-  obj_private_data_t *obj_private;
-  struct section_addr_info section_addrs;
+  struct hppa_objfile_private *obj_private;
+  struct section_addr_info *section_addrs;
+  struct cleanup *my_cleanups;
 
-  memset (&section_addrs, 0, sizeof (section_addrs));
   /* We need the BFD so that we can look at its sections.  We open up the
      file temporarily, then close it when we are done.  */
   tmp_bfd = bfd_openr (name, gnutarget);
@@ -251,7 +251,7 @@ pa64_solib_add_solib_objfile (struct so_list *so, char *name, int from_tty,
 
   /* Now find the true lowest section in the shared library.  */
   sec = NULL;
-  bfd_map_over_sections (tmp_bfd, find_lowest_section, (PTR) &sec);
+  bfd_map_over_sections (tmp_bfd, find_lowest_section, &sec);
 
   if (sec)
     {
@@ -262,33 +262,38 @@ pa64_solib_add_solib_objfile (struct so_list *so, char *name, int from_tty,
       text_addr += sec->filepos;
     }
 
+  section_addrs = alloc_section_addr_info (bfd_count_sections (tmp_bfd));
+  my_cleanups = make_cleanup (xfree, section_addrs);
+
   /* We are done with the temporary bfd.  Get rid of it and make sure
      nobody else can us it.  */
   bfd_close (tmp_bfd);
   tmp_bfd = NULL;
 
   /* Now let the generic code load up symbols for this library.  */
-  section_addrs.other[0].addr = text_addr;
-  section_addrs.other[0].name = ".text";
-  so->objfile = symbol_file_add (name, from_tty, &section_addrs, 0, OBJF_SHARED);
+  section_addrs->other[0].addr = text_addr;
+  section_addrs->other[0].name = ".text";
+  so->objfile = symbol_file_add (name, from_tty, section_addrs, 0, OBJF_SHARED);
   so->abfd = so->objfile->obfd;
 
   /* Mark this as a shared library and save private data.  */
   so->objfile->flags |= OBJF_SHARED;
 
-  if (so->objfile->obj_private == NULL)
+  obj_private = (struct hppa_objfile_private *)
+               objfile_data (so->objfile, hppa_objfile_priv_data);
+  if (obj_private == NULL)
     {
-      obj_private = (obj_private_data_t *)
-       obstack_alloc (&so->objfile->psymbol_obstack,
-                      sizeof (obj_private_data_t));
+      obj_private = (struct hppa_objfile_private *)
+       obstack_alloc (&so->objfile->objfile_obstack,
+                      sizeof (struct hppa_objfile_private));
+      set_objfile_data (so->objfile, hppa_objfile_priv_data, obj_private);
       obj_private->unwind_info = NULL;
       obj_private->so_info = NULL;
-      so->objfile->obj_private = (PTR) obj_private;
     }
 
-  obj_private = (obj_private_data_t *) so->objfile->obj_private;
   obj_private->so_info = so;
   obj_private->dp = so->pa64_solib_desc.linkage_ptr;
+  do_cleanups (my_cleanups);
 }
 
 /* Load debugging information for a shared library.  TARGET may be
@@ -372,7 +377,7 @@ pa64_solib_load_symbols (struct so_list *so, char *name, int from_tty,
    be exceeded.  */
 
 void
-pa64_solib_add (char *arg_string, int from_tty, struct target_ops *target)
+pa64_solib_add (char *arg_string, int from_tty, struct target_ops *target, int readsyms)
 {
   struct minimal_symbol *msymbol;
   CORE_ADDR addr;
@@ -415,7 +420,7 @@ pa64_solib_add (char *arg_string, int from_tty, struct target_ops *target)
 
   /* Read in the load map pointer if we have not done so already.  */
   if (! dld_cache.have_read_dld_descriptor)
-    if (! read_dld_descriptor (target))
+    if (! read_dld_descriptor (target, readsyms))
       return;
 
   /* If the libraries were not mapped private, warn the user.  */
@@ -439,7 +444,7 @@ pa64_solib_add (char *arg_string, int from_tty, struct target_ops *target)
       if (!dll_path)
        error ("pa64_solib_add, unable to read shared library path.");
 
-      add_to_solist (from_tty, dll_path, &dll_desc, 0, target);
+      add_to_solist (from_tty, dll_path, readsyms, &dll_desc, 0, target);
     }
 }
 
@@ -644,7 +649,7 @@ pa64_solib_have_load_event (int pid)
 {
   CORE_ADDR event_kind;
 
-  event_kind = read_register (ARG0_REGNUM);
+  event_kind = read_register (HPPA_ARG0_REGNUM);
   return (event_kind == DLD_CB_LOAD);
 }
 
@@ -655,7 +660,7 @@ pa64_solib_have_unload_event (int pid)
 {
   CORE_ADDR event_kind;
 
-  event_kind = read_register (ARG0_REGNUM);
+  event_kind = read_register (HPPA_ARG0_REGNUM);
   return (event_kind == DLD_CB_UNLOAD);
 }
 
@@ -669,7 +674,7 @@ char *
 pa64_solib_loaded_library_pathname (int pid)
 {
   static char dll_path[MAXPATHLEN];
-  CORE_ADDR  dll_path_addr = read_register (ARG3_REGNUM);
+  CORE_ADDR  dll_path_addr = read_register (HPPA_ARG3_REGNUM);
   read_memory_string (dll_path_addr, dll_path, MAXPATHLEN);
   return dll_path;
 }
@@ -684,7 +689,7 @@ char *
 pa64_solib_unloaded_library_pathname (int pid)
 {
   static char dll_path[MAXPATHLEN];
-  CORE_ADDR dll_path_addr = read_register (ARG3_REGNUM);
+  CORE_ADDR dll_path_addr = read_register (HPPA_ARG3_REGNUM);
   read_memory_string (dll_path_addr, dll_path, MAXPATHLEN);
   return dll_path;
 }
@@ -700,7 +705,7 @@ pa64_solib_in_dynamic_linker (int pid, CORE_ADDR pc)
     return 0;
 
   if (!dld_cache.have_read_dld_descriptor)
-    if (!read_dld_descriptor (&current_target))
+    if (!read_dld_descriptor (&current_target, auto_solib_add))
       return 0;
 
   return (pc >= dld_cache.dld_desc.text_base
@@ -818,7 +823,7 @@ static void
 pa64_solib_sharedlibrary_command (char *args, int from_tty)
 {
   dont_repeat ();
-  pa64_solib_add (args, from_tty, (struct target_ops *) 0);
+  pa64_solib_add (args, from_tty, (struct target_ops *) 0, 1);
 }
 
 /* Return the name of the shared library containing ADDR or NULL if ADDR
@@ -935,8 +940,8 @@ so_lib_thread_start_addr (struct so_list *so)
    descriptor.  If the library is archive bound, then return zero, else
    return nonzero.  */
 
-static boolean
-read_dld_descriptor (struct target_ops *target)
+static int
+read_dld_descriptor (struct target_ops *target, int readsyms)
 {
   char *dll_path;
   asection *dyninfo_sect;
@@ -995,7 +1000,7 @@ read_dld_descriptor (struct target_ops *target)
                        pa64_target_read_memory, 
                        0, 
                        dld_cache.load_map);
-  add_to_solist(0, dll_path,  &dld_cache.dld_desc, 0, target);
+  add_to_solist(0, dll_path, readsyms, &dld_cache.dld_desc, 0, target);
   
   return 1;
 }
@@ -1004,7 +1009,7 @@ read_dld_descriptor (struct target_ops *target)
    which is stored in dld_cache.  The routine elf_locate_base in solib.c 
    was used as a model for this.  */
 
-static boolean
+static int
 read_dynamic_info (asection *dyninfo_sect, dld_cache_t *dld_cache_p)
 {
   char *buf;
@@ -1102,7 +1107,7 @@ pa64_target_read_memory (void *buffer, CORE_ADDR ptr, size_t bufsiz, int ident)
    be read from the inferior process at the address load_module_desc_addr.  */
 
 static void
-add_to_solist (boolean from_tty, char *dll_path,
+add_to_solist (int from_tty, char *dll_path, int readsyms,
               struct load_module_desc *load_module_desc_p,
               CORE_ADDR load_module_desc_addr, struct target_ops *target)
 {
@@ -1158,7 +1163,7 @@ add_to_solist (boolean from_tty, char *dll_path,
   new_so->pa64_solib_desc_addr = load_module_desc_addr;
   new_so->loaded = 1;
   new_so->name = obsavestring (dll_path, strlen(dll_path),
-                              &symfile_objfile->symbol_obstack);
+                              &symfile_objfile->objfile_obstack);
 
   /* If we are not going to load the library, tell the user if we
      haven't already and return.  */
@@ -1166,7 +1171,7 @@ add_to_solist (boolean from_tty, char *dll_path,
   st_size = pa64_solib_sizeof_symbol_table (dll_path);
   pa64_solib_st_size_threshhold_exceeded =
        !from_tty 
-    && auto_solib_add
+    && readsyms
     && (  (st_size + pa64_solib_total_st_size) 
        > (auto_solib_limit * (LONGEST) (1024 * 1024)));
   if (pa64_solib_st_size_threshhold_exceeded)
@@ -1224,13 +1229,13 @@ bfd_lookup_symbol (bfd *abfd, char *symname)
   if (storage_needed > 0)
     {
       symbol_table = (asymbol **) xmalloc (storage_needed);
-      back_to = make_cleanup (xfree, (PTR) symbol_table);
+      back_to = make_cleanup (xfree, symbol_table);
       number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
 
       for (i = 0; i < number_of_symbols; i++)
        {
          sym = *symbol_table++;
-         if (STREQ (sym->name, symname))
+         if (strcmp (sym->name, symname) == 0)
            {
              /* Bfd symbols are section relative. */
              symaddr = sym->value + sym->section->vma;
This page took 0.032744 seconds and 4 git commands to generate.