change delegation for to_read_description
[deliverable/binutils-gdb.git] / gdb / solib-pa64.c
index c26fc62ee86f7d98fa404011467c5cebf9e1c1e0..099e1e7e5863bddadf1e43e22b106ca956e59260 100644 (file)
@@ -1,7 +1,6 @@
 /* Handle PA64 shared libraries for GDB, the GNU Debugger.
 
-   Copyright (C) 2004, 2007, 2008, 2009, 2010, 2011
-   Free Software Foundation, Inc.
+   Copyright (C) 2004-2014 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -16,9 +15,9 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
-   
-   HP in their infinite stupidity choose not to use standard ELF dynamic
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* HP in their infinite stupidity choose not to use standard ELF dynamic
    linker interfaces.  They also choose not to make their ELF dymamic
    linker interfaces compatible with the SOM dynamic linker.  The
    net result is we can not use either of the existing somsolib.c or
@@ -38,6 +37,7 @@
 #include "target.h"
 #include "inferior.h"
 #include "regcache.h"
+#include "gdb_bfd.h"
 
 #include "hppa-tdep.h"
 #include "solist.h"
@@ -60,7 +60,7 @@ struct lm_info {
   CORE_ADDR desc_addr;
 };
 
-/* When adding fields, be sure to clear them in _initialize_pa64_solib. */
+/* When adding fields, be sure to clear them in _initialize_pa64_solib.  */
 typedef struct
   {
     CORE_ADDR dld_flags_addr;
@@ -76,8 +76,8 @@ dld_cache_t;
 
 static dld_cache_t dld_cache;
 
-static int
-read_dynamic_info (asection *dyninfo_sect, dld_cache_t *dld_cache_p);
+static int read_dynamic_info (asection *dyninfo_sect,
+                             dld_cache_t *dld_cache_p);
 
 static void
 pa64_relocate_section_addresses (struct so_list *so,
@@ -166,7 +166,7 @@ read_dld_descriptor (void)
   if (!dld_cache.load_map)
     return 0;
 
-  /* Read in the dld load module descriptor */
+  /* Read in the dld load module descriptor */
   if (dlgetmodinfo (-1, 
                    &dld_cache.dld_desc,
                    sizeof (dld_cache.dld_desc), 
@@ -206,7 +206,7 @@ read_dynamic_info (asection *dyninfo_sect, dld_cache_t *dld_cache_p)
     return 0;
 
   /* Scan the .dynamic section and record the items of interest. 
-     In particular, DT_HP_DLD_FLAGS */
+     In particular, DT_HP_DLD_FLAGS */
   for (bufend = buf + dyninfo_sect_size, entry_addr = dyninfo_addr;
        buf < bufend;
        buf += sizeof (Elf64_Dyn), entry_addr += sizeof (Elf64_Dyn))
@@ -224,7 +224,7 @@ read_dynamic_info (asection *dyninfo_sect, dld_cache_t *dld_cache_p)
        break;
       else if (dyn_tag == DT_HP_DLD_FLAGS)
        {
-         /* Set dld_flags_addr and dld_flags in *dld_cache_p */
+         /* Set dld_flags_addr and dld_flags in *dld_cache_p */
          dld_cache_p->dld_flags_addr = entry_addr + offsetof(Elf64_Dyn, d_un);
          if (target_read_memory (dld_cache_p->dld_flags_addr,
                                  (char*) &dld_cache_p->dld_flags, 
@@ -251,11 +251,11 @@ read_dynamic_info (asection *dyninfo_sect, dld_cache_t *dld_cache_p)
        }
       else 
        {
-         /* tag is not of interest */
+         /* Tag is not of interest.  */
        }
     }
 
-  /* Record other information and set is_valid to 1. */
+  /* Record other information and set is_valid to 1.  */
   dld_cache_p->dyninfo_sect = dyninfo_sect;
 
   /* Verify that we read in required info.  These fields are re-set to zero
@@ -269,53 +269,14 @@ read_dynamic_info (asection *dyninfo_sect, dld_cache_t *dld_cache_p)
   return 1;
 }
 
-/*
-   bfd_lookup_symbol -- lookup the value for a specific symbol
-
-   An expensive way to lookup the value of a single symbol for
-   bfd's that are only temporary anyway.  This is used by the
-   shared library support to find the address of the debugger
-   interface structures in the shared library.
-
-   Note that 0 is specifically allowed as an error return (no
-   such symbol).
- */
+/* Helper function for gdb_bfd_lookup_symbol_from_symtab.  */
 
-static CORE_ADDR
-bfd_lookup_symbol (bfd *abfd, char *symname)
+static int
+cmp_name (asymbol *sym, void *data)
 {
-  unsigned int storage_needed;
-  asymbol *sym;
-  asymbol **symbol_table;
-  unsigned int number_of_symbols;
-  unsigned int i;
-  struct cleanup *back_to;
-  CORE_ADDR symaddr = 0;
-
-  storage_needed = bfd_get_symtab_upper_bound (abfd);
-
-  if (storage_needed > 0)
-    {
-      symbol_table = (asymbol **) xmalloc (storage_needed);
-      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 (strcmp (sym->name, symname) == 0)
-           {
-             /* Bfd symbols are section relative. */
-             symaddr = sym->value + sym->section->vma;
-             break;
-           }
-       }
-      do_cleanups (back_to);
-    }
-  return (symaddr);
+  return (strcmp (sym->name, (const char *) data) == 0);
 }
 
-
 /* This hook gets called just before the first instruction in the
    inferior process is executed.
 
@@ -337,7 +298,6 @@ pa64_solib_create_inferior_hook (int from_tty)
   struct minimal_symbol *msymbol;
   unsigned int dld_flags, status;
   asection *shlib_info, *interp_sect;
-  char buf[4];
   struct objfile *objfile;
   CORE_ADDR anaddr;
 
@@ -402,7 +362,7 @@ manpage for methods to privately map shared library text."));
         to find any magic formula to find it for Solaris (appears to
         be trivial on GNU/Linux).  Therefore, we have to try an alternate
         mechanism to find the dynamic linker's base address.  */
-      tmp_bfd = bfd_openr (buf, gnutarget);
+      tmp_bfd = gdb_bfd_open (buf, gnutarget, -1);
       if (tmp_bfd == NULL)
        return;
 
@@ -411,25 +371,26 @@ manpage for methods to privately map shared library text."));
        {
          warning (_("Unable to grok dynamic linker %s as an object file"),
                   buf);
-         bfd_close (tmp_bfd);
+         gdb_bfd_unref (tmp_bfd);
          return;
        }
 
       /* We find the dynamic linker's base address by examining the
         current pc (which point at the entry point for the dynamic
-        linker) and subtracting the offset of the entry point. 
+        linker) and subtracting the offset of the entry point.
 
         Also note the breakpoint is the second instruction in the
         routine.  */
       load_addr = regcache_read_pc (get_current_regcache ())
                  - tmp_bfd->start_address;
-      sym_addr = bfd_lookup_symbol (tmp_bfd, "__dld_break");
+      sym_addr = gdb_bfd_lookup_symbol_from_symtab (tmp_bfd, cmp_name,
+                                                   "__dld_break");
       sym_addr = load_addr + sym_addr + 4;
       
       /* Create the shared library breakpoint.  */
       {
        struct breakpoint *b
-         = create_solib_event_breakpoint (target_gdbarch, sym_addr);
+         = create_solib_event_breakpoint (target_gdbarch (), sym_addr);
 
        /* The breakpoint is actually hard-coded into the dynamic linker,
           so we don't need to actually insert a breakpoint instruction
@@ -440,7 +401,7 @@ manpage for methods to privately map shared library text."));
       }
 
       /* We're done with the temporary bfd.  */
-      bfd_close (tmp_bfd);
+      gdb_bfd_unref (tmp_bfd);
     }
 }
 
@@ -526,7 +487,6 @@ static int
 pa64_open_symbol_file_object (void *from_ttyp)
 {
   int from_tty = *(int *)from_ttyp;
-  char buf[4];
   struct load_module_desc dll_desc;
   char *dll_path;
 
@@ -629,7 +589,7 @@ pa64_solib_get_solib_by_pc (CORE_ADDR addr)
   return retval;
 }
 
-/* pa64 libraries do not seem to set the section offsets in a standard (i.e. 
+/* pa64 libraries do not seem to set the section offsets in a standard (i.e.
    SVr4) way; the text section offset stored in the file doesn't correspond
    to the place where the library is actually loaded into memory.  Instead,
    we rely on the dll descriptor to tell us where things were loaded.  */
This page took 0.02796 seconds and 4 git commands to generate.