Add gdb_ref_ptr.h
[deliverable/binutils-gdb.git] / gdb / solib.c
index d6ab93d3c4087e1ffe66efb001086289d4353938..ed684a275c9ee67fd8ed163e7e241e8cb92522ae 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-2017 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;
 }
@@ -150,7 +152,7 @@ show_solib_search_path (struct ui_file *file, int from_tty,
 */
 
 static char *
-solib_find_1 (char *in_pathname, int *fd, int is_solib)
+solib_find_1 (const char *in_pathname, int *fd, int is_solib)
 {
   const struct target_so_ops *ops = solib_ops (target_gdbarch ());
   int found_file = -1;
@@ -378,21 +380,22 @@ 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)
+exec_file_find (const 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;
 
@@ -403,6 +406,21 @@ exec_file_find (char *in_pathname, int *fd)
          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;
 }
@@ -416,7 +434,7 @@ exec_file_find (char *in_pathname, int *fd)
    above.  */
 
 char *
-solib_find (char *in_pathname, int *fd)
+solib_find (const char *in_pathname, int *fd)
 {
   const char *solib_symbols_extension
     = gdbarch_solib_symbols_extension (target_gdbarch ());
@@ -425,7 +443,7 @@ solib_find (char *in_pathname, int *fd)
      extension.  */
   if (solib_symbols_extension != NULL)
     {
-      char *p = in_pathname + strlen (in_pathname);
+      const char *p = in_pathname + strlen (in_pathname);
 
       while (p > in_pathname && *p != '.')
        p--;
@@ -667,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)
     {
@@ -694,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;
        }
@@ -997,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))
@@ -1022,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;
            }
        }
@@ -1036,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 ();
       }
   }
 }
@@ -1094,13 +1110,12 @@ info_sharedlibrary_command (char *pattern, int from_tty)
                                         "SharedLibraryTable");
 
   /* The "- 1" is because ui_out adds one space between columns.  */
-  ui_out_table_header (uiout, addr_width - 1, ui_left, "from", "From");
-  ui_out_table_header (uiout, addr_width - 1, ui_left, "to", "To");
-  ui_out_table_header (uiout, 12 - 1, ui_left, "syms-read", "Syms Read");
-  ui_out_table_header (uiout, 0, ui_noalign,
-                      "name", "Shared Object Library");
+  uiout->table_header (addr_width - 1, ui_left, "from", "From");
+  uiout->table_header (addr_width - 1, ui_left, "to", "To");
+  uiout->table_header (12 - 1, ui_left, "syms-read", "Syms Read");
+  uiout->table_header (0, ui_noalign, "name", "Shared Object Library");
 
-  ui_out_table_body (uiout);
+  uiout->table_body ();
 
   for (so = so_list_head; so; so = so->next)
     {
@@ -1115,29 +1130,28 @@ info_sharedlibrary_command (char *pattern, int from_tty)
 
       if (so->addr_high != 0)
        {
-         ui_out_field_core_addr (uiout, "from", gdbarch, so->addr_low);
-         ui_out_field_core_addr (uiout, "to", gdbarch, so->addr_high);
+         uiout->field_core_addr ("from", gdbarch, so->addr_low);
+         uiout->field_core_addr ("to", gdbarch, so->addr_high);
        }
       else
        {
-         ui_out_field_skip (uiout, "from");
-         ui_out_field_skip (uiout, "to");
+         uiout->field_skip ("from");
+         uiout->field_skip ("to");
        }
 
-      if (! ui_out_is_mi_like_p (interp_ui_out (top_level_interpreter ()))
+      if (! interp_ui_out (top_level_interpreter ())->is_mi_like_p ()
          && so->symbols_loaded
          && !objfile_has_symbols (so->objfile))
        {
          so_missing_debug_info = 1;
-         ui_out_field_string (uiout, "syms-read", "Yes (*)");
+         uiout->field_string ("syms-read", "Yes (*)");
        }
       else
-       ui_out_field_string (uiout, "syms-read", 
-                            so->symbols_loaded ? "Yes" : "No");
+       uiout->field_string ("syms-read", so->symbols_loaded ? "Yes" : "No");
 
-      ui_out_field_string (uiout, "name", so->so_name);
+      uiout->field_string ("name", so->so_name);
 
-      ui_out_text (uiout, "\n");
+      uiout->text ("\n");
 
       do_cleanups (lib_cleanup);
     }
@@ -1147,17 +1161,14 @@ info_sharedlibrary_command (char *pattern, int from_tty)
   if (nr_libs == 0)
     {
       if (pattern)
-       ui_out_message (uiout, 0,
-                       _("No shared libraries matched.\n"));
+       uiout->message (_("No shared libraries matched.\n"));
       else
-       ui_out_message (uiout, 0,
-                       _("No shared libraries loaded at this time.\n"));
+       uiout->message (_("No shared libraries loaded at this time.\n"));
     }
   else
     {
       if (so_missing_debug_info)
-       ui_out_message (uiout, 0,
-                       _("(*): Shared library is missing "
+       uiout->message (_("(*): Shared library is missing "
                          "debugging information.\n"));
     }
 }
@@ -1224,29 +1235,7 @@ clear_solib (void)
 {
   const struct target_so_ops *ops = solib_ops (target_gdbarch ());
 
-  /* This function is expected to handle ELF shared libraries.  It is
-     also used on Solaris, which can run either ELF or a.out binaries
-     (for compatibility with SunOS 4), both of which can use shared
-     libraries.  So we don't know whether we have an ELF executable or
-     an a.out executable until the user chooses an executable file.
-
-     ELF shared libraries don't get mapped into the address space
-     until after the program starts, so we'd better not try to insert
-     breakpoints in them immediately.  We have to wait until the
-     dynamic linker has loaded them; we'll hit a bp_shlib_event
-     breakpoint (look for calls to create_solib_event_breakpoint) when
-     it's ready.
-
-     SunOS shared libraries seem to be different --- they're present
-     as soon as the process begins execution, so there's no need to
-     put off inserting breakpoints.  There's also nowhere to put a
-     bp_shlib_event breakpoint, so if we put it off, we'll never get
-     around to it.
-
-     So: disable breakpoints only if we're using ELF shared libs.  */
-  if (exec_bfd != NULL
-      && bfd_get_flavour (exec_bfd) != bfd_target_aout_flavour)
-    disable_breakpoints_in_shlibs ();
+  disable_breakpoints_in_shlibs ();
 
   while (so_list_head)
     {
@@ -1359,8 +1348,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);
@@ -1409,7 +1400,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);
        }
     }
 
@@ -1466,8 +1457,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:"
@@ -1531,8 +1520,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;
@@ -1590,8 +1580,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;
@@ -1628,8 +1619,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.038074 seconds and 4 git commands to generate.