2011-01-05 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / solib-frv.c
index eec4e782661fd8b02425ac3d5b9ce79b87258ba7..b67c8122e9aca33c78ccb0fb09f580248b055e3d 100644 (file)
@@ -1,5 +1,6 @@
 /* Handle FR-V (FDPIC) shared libraries for GDB, the GNU Debugger.
-   Copyright (C) 2004, 2007, 2008, 2009 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2007, 2008, 2009, 2010, 2011
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -472,9 +473,11 @@ frv_current_sos (void)
                            "current_sos: reading link_map entry at %s\n",
                            hex_string_custom (lm_addr, 8));
 
-      if (target_read_memory (lm_addr, (gdb_byte *) &lm_buf, sizeof (lm_buf)) != 0)
+      if (target_read_memory (lm_addr, (gdb_byte *) &lm_buf,
+                             sizeof (lm_buf)) != 0)
        {
-         warning (_("frv_current_sos: Unable to read link map entry.  Shared object chain may be incomplete."));
+         warning (_("frv_current_sos: Unable to read link map entry.  "
+                    "Shared object chain may be incomplete."));
          break;
        }
 
@@ -500,7 +503,8 @@ frv_current_sos (void)
          loadmap = fetch_loadmap (addr);
          if (loadmap == NULL)
            {
-             warning (_("frv_current_sos: Unable to fetch load map.  Shared object chain may be incomplete."));
+             warning (_("frv_current_sos: Unable to fetch load map.  "
+                        "Shared object chain may be incomplete."));
              break;
            }
 
@@ -631,7 +635,6 @@ enable_break_failure_warning (void)
 
  */
 
-static int enable_break1_done = 0;
 static int enable_break2_done = 0;
 
 static int
@@ -642,15 +645,9 @@ enable_break2 (void)
   char **bkpt_namep;
   asection *interp_sect;
 
-  if (!enable_break1_done || enable_break2_done)
+  if (enable_break2_done)
     return 1;
 
-  enable_break2_done = 1;
-
-  /* First, remove all the solib event breakpoints.  Their addresses
-     may have changed since the last time we ran the program.  */
-  remove_solib_event_breakpoints ();
-
   interp_text_sect_low = interp_text_sect_high = 0;
   interp_plt_sect_low = interp_plt_sect_high = 0;
 
@@ -745,7 +742,8 @@ enable_break2 (void)
       addr = bfd_lookup_symbol (tmp_bfd, "_dl_debug_addr");
       if (addr == 0)
        {
-         warning (_("Could not find symbol _dl_debug_addr in dynamic linker"));
+         warning (_("Could not find symbol _dl_debug_addr "
+                    "in dynamic linker"));
          enable_break_failure_warning ();
          bfd_close (tmp_bfd);
          return 0;
@@ -753,29 +751,49 @@ enable_break2 (void)
 
       if (solib_frv_debug)
        fprintf_unfiltered (gdb_stdlog,
-                           "enable_break: _dl_debug_addr (prior to relocation) = %s\n",
+                           "enable_break: _dl_debug_addr "
+                           "(prior to relocation) = %s\n",
                            hex_string_custom (addr, 8));
 
       addr += displacement_from_map (ldm, addr);
 
       if (solib_frv_debug)
        fprintf_unfiltered (gdb_stdlog,
-                           "enable_break: _dl_debug_addr (after relocation) = %s\n",
+                           "enable_break: _dl_debug_addr "
+                           "(after relocation) = %s\n",
                            hex_string_custom (addr, 8));
 
       /* Fetch the address of the r_debug struct.  */
       if (target_read_memory (addr, addr_buf, sizeof addr_buf) != 0)
        {
-         warning (_("Unable to fetch contents of _dl_debug_addr (at address %s) from dynamic linker"),
+         warning (_("Unable to fetch contents of _dl_debug_addr "
+                    "(at address %s) from dynamic linker"),
                   hex_string_custom (addr, 8));
        }
       addr = extract_unsigned_integer (addr_buf, sizeof addr_buf, byte_order);
 
+      if (solib_frv_debug)
+       fprintf_unfiltered (gdb_stdlog,
+                           "enable_break: _dl_debug_addr[0..3] = %s\n",
+                           hex_string_custom (addr, 8));
+
+      /* If it's zero, then the ldso hasn't initialized yet, and so
+         there are no shared libs yet loaded.  */
+      if (addr == 0)
+       {
+         if (solib_frv_debug)
+           fprintf_unfiltered (gdb_stdlog,
+                               "enable_break: ldso not yet initialized\n");
+         /* Do not warn, but mark to run again.  */
+         return 0;
+       }
+
       /* Fetch the r_brk field.  It's 8 bytes from the start of
          _dl_debug_addr.  */
       if (target_read_memory (addr + 8, addr_buf, sizeof addr_buf) != 0)
        {
-         warning (_("Unable to fetch _dl_debug_addr->r_brk (at address %s) from dynamic linker"),
+         warning (_("Unable to fetch _dl_debug_addr->r_brk "
+                    "(at address %s) from dynamic linker"),
                   hex_string_custom (addr + 8, 8));
          enable_break_failure_warning ();
          bfd_close (tmp_bfd);
@@ -786,7 +804,8 @@ enable_break2 (void)
       /* Now fetch the function entry point.  */
       if (target_read_memory (addr, addr_buf, sizeof addr_buf) != 0)
        {
-         warning (_("Unable to fetch _dl_debug_addr->.r_brk entry point (at address %s) from dynamic linker"),
+         warning (_("Unable to fetch _dl_debug_addr->.r_brk entry point "
+                    "(at address %s) from dynamic linker"),
                   hex_string_custom (addr, 8));
          enable_break_failure_warning ();
          bfd_close (tmp_bfd);
@@ -800,9 +819,15 @@ enable_break2 (void)
       /* We're also done with the loadmap.  */
       xfree (ldm);
 
+      /* Remove all the solib event breakpoints.  Their addresses
+         may have changed since the last time we ran the program.  */
+      remove_solib_event_breakpoints ();
+
       /* Now (finally!) create the solib breakpoint.  */
       create_solib_event_breakpoint (target_gdbarch, addr);
 
+      enable_break2_done = 1;
+
       return 1;
     }
 
@@ -818,34 +843,44 @@ enable_break (void)
 {
   asection *interp_sect;
 
-  /* Remove all the solib event breakpoints.  Their addresses
-     may have changed since the last time we ran the program.  */
-  remove_solib_event_breakpoints ();
+  if (symfile_objfile == NULL)
+    {
+      if (solib_frv_debug)
+       fprintf_unfiltered (gdb_stdlog,
+                           "enable_break: No symbol file found.\n");
+      return 0;
+    }
+
+  if (!symfile_objfile->ei.entry_point_p)
+    {
+      if (solib_frv_debug)
+       fprintf_unfiltered (gdb_stdlog,
+                           "enable_break: Symbol file has no entry point.\n");
+      return 0;
+    }
 
   /* Check for the presence of a .interp section.  If there is no
      such section, the executable is statically linked.  */
 
   interp_sect = bfd_get_section_by_name (exec_bfd, ".interp");
 
-  if (interp_sect)
-    {
-      enable_break1_done = 1;
-      create_solib_event_breakpoint (target_gdbarch,
-                                    symfile_objfile->ei.entry_point);
-
-      if (solib_frv_debug)
-       fprintf_unfiltered (gdb_stdlog,
-                           "enable_break: solib event breakpoint placed at entry point: %s\n",
-                           hex_string_custom
-                             (symfile_objfile->ei.entry_point, 8));
-    }
-  else
+  if (interp_sect == NULL)
     {
       if (solib_frv_debug)
        fprintf_unfiltered (gdb_stdlog,
-                           "enable_break: No .interp section found.\n");
+                           "enable_break: No .interp section found.\n");
+      return 0;
     }
 
+  create_solib_event_breakpoint (target_gdbarch,
+                                symfile_objfile->ei.entry_point);
+
+  if (solib_frv_debug)
+    fprintf_unfiltered (gdb_stdlog,
+                       "enable_break: solib event breakpoint "
+                       "placed at entry point: %s\n",
+                       hex_string_custom (symfile_objfile->ei.entry_point,
+                                          8));
   return 1;
 }
 
@@ -971,7 +1006,7 @@ frv_relocate_main_executable (void)
  */
 
 static void
-frv_solib_create_inferior_hook (void)
+frv_solib_create_inferior_hook (int from_tty)
 {
   /* Relocate main executable.  */
   frv_relocate_main_executable ();
@@ -988,7 +1023,6 @@ static void
 frv_clear_solib (void)
 {
   lm_base_cache = 0;
-  enable_break1_done = 0;
   enable_break2_done = 0;
   main_lm_addr = 0;
   if (main_executable_lm_info != 0)
@@ -1025,6 +1059,7 @@ frv_relocate_section_addresses (struct so_list *so,
           && sec->addr < map->segs[seg].p_vaddr + map->segs[seg].p_memsz)
        {
          CORE_ADDR displ = map->segs[seg].addr - map->segs[seg].p_vaddr;
+
          sec->addr += displ;
          sec->endaddr += displ;
          break;
@@ -1040,7 +1075,8 @@ main_got (void)
 {
   struct minimal_symbol *got_sym;
 
-  got_sym = lookup_minimal_symbol ("_GLOBAL_OFFSET_TABLE_", NULL, symfile_objfile);
+  got_sym = lookup_minimal_symbol ("_GLOBAL_OFFSET_TABLE_",
+                                  NULL, symfile_objfile);
   if (got_sym == 0)
     return 0;
 
@@ -1300,6 +1336,7 @@ _initialize_frv_solib (void)
   frv_so_ops.current_sos = frv_current_sos;
   frv_so_ops.open_symbol_file_object = open_symbol_file_object;
   frv_so_ops.in_dynsym_resolve_code = frv_in_dynsym_resolve_code;
+  frv_so_ops.bfd_open = solib_bfd_open;
 
   /* Debug this file's internals.  */
   add_setshow_zinteger_cmd ("solib-frv", class_maintenance,
This page took 0.026563 seconds and 4 git commands to generate.