Hurd: Adjust to changes to "push pruning old threads down to the target"
[deliverable/binutils-gdb.git] / gdb / solib.c
index c46116d4fbcdb162c187fdfa07b3fbc2ef2cf9ee..db370e9ff87c6aa6413161ead9a5a722390699cc 100644 (file)
@@ -1,6 +1,6 @@
 /* Handle shared libraries for GDB, the GNU Debugger.
 
-   Copyright (C) 1990-2015 Free Software Foundation, Inc.
+   Copyright (C) 1990-2016 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -65,7 +65,8 @@ solib_init (struct obstack *obstack)
 static const struct target_so_ops *
 solib_ops (struct gdbarch *gdbarch)
 {
-  const struct target_so_ops **ops = gdbarch_data (gdbarch, solib_data);
+  const struct target_so_ops **ops
+    = (const struct target_so_ops **) gdbarch_data (gdbarch, solib_data);
 
   return *ops;
 }
@@ -75,7 +76,8 @@ solib_ops (struct gdbarch *gdbarch)
 void
 set_solib_ops (struct gdbarch *gdbarch, const struct target_so_ops *new_ops)
 {
-  const struct target_so_ops **ops = gdbarch_data (gdbarch, solib_data);
+  const struct target_so_ops **ops
+    = (const struct target_so_ops **) gdbarch_data (gdbarch, solib_data);
 
   *ops = new_ops;
 }
@@ -192,7 +194,7 @@ solib_find_1 (char *in_pathname, int *fd, int is_solib)
       char *p;
 
       /* Avoid clobbering our input.  */
-      p = alloca (strlen (in_pathname) + 1);
+      p = (char *) alloca (strlen (in_pathname) + 1);
       strcpy (p, in_pathname);
       in_pathname = p;
 
@@ -378,31 +380,47 @@ solib_find_1 (char *in_pathname, int *fd, int is_solib)
 /* Return the full pathname of the main executable, or NULL if not
    found.  The returned pathname is malloc'ed and must be freed by
    the caller.  If FD is non-NULL, *FD is set to either -1 or an open
-   file handle for the main executable.
-
-   The search algorithm used is described in solib_find_1's comment
-   above.  */
+   file handle for the main executable.  */
 
 char *
 exec_file_find (char *in_pathname, int *fd)
 {
-  char *result = solib_find_1 (in_pathname, fd, 0);
+  char *result;
+  const char *fskind = effective_target_file_system_kind ();
+
+  if (in_pathname == NULL)
+    return NULL;
 
-  if (result == NULL)
+  if (*gdb_sysroot != '\0' && IS_TARGET_ABSOLUTE_PATH (fskind, in_pathname))
     {
-      const char *fskind = effective_target_file_system_kind ();
+      result = solib_find_1 (in_pathname, fd, 0);
 
-      if (fskind == file_system_kind_dos_based)
+      if (result == NULL && fskind == file_system_kind_dos_based)
        {
          char *new_pathname;
 
-         new_pathname = alloca (strlen (in_pathname) + 5);
+         new_pathname = (char *) alloca (strlen (in_pathname) + 5);
          strcpy (new_pathname, in_pathname);
          strcat (new_pathname, ".exe");
 
          result = solib_find_1 (new_pathname, fd, 0);
        }
     }
+  else
+    {
+      /* It's possible we don't have a full path, but rather just a
+        filename.  Some targets, such as HP-UX, don't provide the
+        full path, sigh.
+
+        Attempt to qualify the filename against the source path.
+        (If that fails, we'll just fall back on the original
+        filename.  Not much more we can do...)  */
+
+      if (!source_full_path_of (in_pathname, &result))
+       result = xstrdup (in_pathname);
+      if (fd != NULL)
+       *fd = -1;
+    }
 
   return result;
 }
@@ -434,8 +452,9 @@ solib_find (char *in_pathname, int *fd)
        {
          char *new_pathname;
 
-         new_pathname = alloca (p - in_pathname + 1
-                                + strlen (solib_symbols_extension) + 1);
+         new_pathname
+           = (char *) alloca (p - in_pathname + 1
+                              + strlen (solib_symbols_extension) + 1);
          memcpy (new_pathname, in_pathname, p - in_pathname + 1);
          strcpy (new_pathname + (p - in_pathname) + 1,
                  solib_symbols_extension);
@@ -666,7 +685,7 @@ master_so_list (void)
    loaded.  */
 
 int
-solib_read_symbols (struct so_list *so, int flags)
+solib_read_symbols (struct so_list *so, symfile_add_flags flags)
 {
   if (so->symbols_loaded)
     {
@@ -693,16 +712,16 @@ solib_read_symbols (struct so_list *so, int flags)
                  && so->objfile->addr_low == so->addr_low)
                break;
            }
-         if (so->objfile != NULL)
-           break;
-
-         sap = build_section_addr_info_from_section_table (so->sections,
-                                                           so->sections_end);
-         so->objfile = symbol_file_add_from_bfd (so->abfd, so->so_name,
-                                                 flags, sap, OBJF_SHARED,
-                                                 NULL);
-         so->objfile->addr_low = so->addr_low;
-         free_section_addr_info (sap);
+         if (so->objfile == NULL)
+           {
+             sap = build_section_addr_info_from_section_table (so->sections,
+                                                               so->sections_end);
+             so->objfile = symbol_file_add_from_bfd (so->abfd, so->so_name,
+                                                     flags, sap, OBJF_SHARED,
+                                                     NULL);
+             so->objfile->addr_low = so->addr_low;
+             free_section_addr_info (sap);
+           }
 
          so->symbols_loaded = 1;
        }
@@ -996,8 +1015,10 @@ solib_add (const char *pattern, int from_tty,
   {
     int any_matches = 0;
     int loaded_any_symbols = 0;
-    const int flags =
-        SYMFILE_DEFER_BP_RESET | (from_tty ? SYMFILE_VERBOSE : 0);
+    symfile_add_flags add_flags = SYMFILE_DEFER_BP_RESET;
+
+    if (from_tty)
+        add_flags |= SYMFILE_VERBOSE;
 
     for (gdb = so_list_head; gdb; gdb = gdb->next)
       if (! pattern || re_exec (gdb->so_name))
@@ -1021,7 +1042,7 @@ solib_add (const char *pattern, int from_tty,
                    printf_unfiltered (_("Symbols already loaded for %s\n"),
                                       gdb->so_name);
                }
-             else if (solib_read_symbols (gdb, flags))
+             else if (solib_read_symbols (gdb, add_flags))
                loaded_any_symbols = 1;
            }
        }
@@ -1035,13 +1056,9 @@ solib_add (const char *pattern, int from_tty,
 
     if (loaded_any_symbols)
       {
-       const struct target_so_ops *ops = solib_ops (target_gdbarch ());
-
        /* Getting new symbols may change our opinion about what is
           frameless.  */
        reinit_frame_cache ();
-
-       ops->special_symbol_handling ();
       }
   }
 }
@@ -1146,16 +1163,16 @@ info_sharedlibrary_command (char *pattern, int from_tty)
   if (nr_libs == 0)
     {
       if (pattern)
-       ui_out_message (uiout, 0,
+       ui_out_message (uiout,
                        _("No shared libraries matched.\n"));
       else
-       ui_out_message (uiout, 0,
+       ui_out_message (uiout,
                        _("No shared libraries loaded at this time.\n"));
     }
   else
     {
       if (so_missing_debug_info)
-       ui_out_message (uiout, 0,
+       ui_out_message (uiout,
                        _("(*): Shared library is missing "
                          "debugging information.\n"));
     }
@@ -1358,8 +1375,10 @@ reload_shared_libraries_1 (int from_tty)
       char *filename, *found_pathname = NULL;
       bfd *abfd;
       int was_loaded = so->symbols_loaded;
-      const int flags =
-       SYMFILE_DEFER_BP_RESET | (from_tty ? SYMFILE_VERBOSE : 0);
+      symfile_add_flags add_flags = SYMFILE_DEFER_BP_RESET;
+
+      if (from_tty)
+       add_flags |= SYMFILE_VERBOSE;
 
       filename = tilde_expand (so->so_original_name);
       make_cleanup (xfree, filename);
@@ -1408,7 +1427,7 @@ reload_shared_libraries_1 (int from_tty)
 
            if (!got_error
                && (auto_solib_add || was_loaded || libpthread_solib_p (so)))
-             solib_read_symbols (so, flags);
+             solib_read_symbols (so, add_flags);
        }
     }
 
@@ -1465,8 +1484,6 @@ reload_shared_libraries (char *ignored, int from_tty,
      structures that are now freed.  Also, getting new symbols may
      change our opinion about what is frameless.  */
   reinit_frame_cache ();
-
-  ops->special_symbol_handling ();
 }
 
 /* Wrapper for reload_shared_libraries that replaces "remote:"
@@ -1530,8 +1547,9 @@ solib_global_lookup (struct objfile *objfile,
 
 CORE_ADDR
 gdb_bfd_lookup_symbol_from_symtab (bfd *abfd,
-                                  int (*match_sym) (asymbol *, void *),
-                                  void *data)
+                                  int (*match_sym) (const asymbol *,
+                                                    const void *),
+                                  const void *data)
 {
   long storage_needed = bfd_get_symtab_upper_bound (abfd);
   CORE_ADDR symaddr = 0;
@@ -1589,8 +1607,9 @@ gdb_bfd_lookup_symbol_from_symtab (bfd *abfd,
 
 static CORE_ADDR
 bfd_lookup_symbol_from_dyn_symtab (bfd *abfd,
-                                  int (*match_sym) (asymbol *, void *),
-                                  void *data)
+                                  int (*match_sym) (const asymbol *,
+                                                    const void *),
+                                  const void *data)
 {
   long storage_needed = bfd_get_dynamic_symtab_upper_bound (abfd);
   CORE_ADDR symaddr = 0;
@@ -1627,8 +1646,8 @@ bfd_lookup_symbol_from_dyn_symtab (bfd *abfd,
 
 CORE_ADDR
 gdb_bfd_lookup_symbol (bfd *abfd,
-                      int (*match_sym) (asymbol *, void *),
-                      void *data)
+                      int (*match_sym) (const asymbol *, const void *),
+                      const void *data)
 {
   CORE_ADDR symaddr = gdb_bfd_lookup_symbol_from_symtab (abfd, match_sym, data);
 
This page took 0.026455 seconds and 4 git commands to generate.