(TRAP_REMOVE_SYSCALL_FLAG): New macro.
[deliverable/binutils-gdb.git] / gdb / solib.c
index 53d5d1bcb75a28267322e6aaf0a17f346de25fad..a2ad0c4c1cdf475b943ee1155decd2166adf1a23 100644 (file)
@@ -46,6 +46,7 @@
 #include "readline/readline.h"
 #include "remote.h"
 #include "solib.h"
+#include "interps.h"
 
 /* Architecture-specific operations.  */
 
@@ -285,16 +286,11 @@ solib_bfd_fopen (char *pathname, int fd)
 bfd *
 solib_bfd_open (char *pathname)
 {
-  struct target_so_ops *ops = solib_ops (target_gdbarch);
   char *found_pathname;
   int found_file;
   bfd *abfd;
   const struct bfd_arch_info *b;
 
-  /* Use target-specific override if present.  */
-  if (ops->bfd_open)
-    return ops->bfd_open (pathname);
-
   /* Search for shared library file.  */
   found_pathname = solib_find (pathname, &found_file);
   if (found_pathname == NULL)
@@ -314,7 +310,7 @@ solib_bfd_open (char *pathname)
 
   /* Check bfd arch.  */
   b = gdbarch_bfd_arch_info (target_gdbarch);
-  if (b->compatible (b, bfd_get_arch_info (abfd)) != b)
+  if (!b->compatible (b, bfd_get_arch_info (abfd)))
     warning (_("`%s': Shared library architecture %s is not compatible "
                "with target architecture %s."), found_pathname,
              bfd_get_arch_info (abfd)->printable_name, b->printable_name);
@@ -354,6 +350,7 @@ static int
 solib_map_sections (void *arg)
 {
   struct so_list *so = (struct so_list *) arg; /* catch_errors bogon */
+  struct target_so_ops *ops = solib_ops (target_gdbarch);
   char *filename;
   struct target_section *p;
   struct cleanup *old_chain;
@@ -361,11 +358,11 @@ solib_map_sections (void *arg)
 
   filename = tilde_expand (so->so_name);
   old_chain = make_cleanup (xfree, filename);
-  abfd = solib_bfd_open (filename);
+  abfd = ops->bfd_open (filename);
   do_cleanups (old_chain);
 
   /* Leave bfd open, core_xfer_memory and "info files" need it.  */
-  so->abfd = abfd;
+  so->abfd = gdb_bfd_ref (abfd);
 
   /* copy full path name into so_name, so that later symbol_file_add
      can find it */
@@ -381,8 +378,6 @@ solib_map_sections (void *arg)
 
   for (p = so->sections; p < so->sections_end; p++)
     {
-      struct target_so_ops *ops = solib_ops (target_gdbarch);
-
       /* Relocate the section binding addresses as recorded in the shared
          object's file by the base address to which the object was actually
          mapped. */
@@ -427,21 +422,11 @@ void
 free_so (struct so_list *so)
 {
   struct target_so_ops *ops = solib_ops (target_gdbarch);
-  char *bfd_filename = 0;
 
   if (so->sections)
     xfree (so->sections);
-      
-  if (so->abfd)
-    {
-      bfd_filename = bfd_get_filename (so->abfd);
-      if (! bfd_close (so->abfd))
-       warning (_("cannot close \"%s\": %s"),
-                bfd_filename, bfd_errmsg (bfd_get_error ()));
-    }
 
-  if (bfd_filename)
-    xfree (bfd_filename);
+  gdb_bfd_unref (so->abfd);
 
   ops->free_so (so);
 
@@ -471,8 +456,7 @@ symbol_add_stub (struct so_list *so, int flags)
   sap = build_section_addr_info_from_section_table (so->sections,
                                                     so->sections_end);
 
-  so->objfile = symbol_file_add_from_bfd (so->abfd, flags,
-                                         sap, OBJF_SHARED | OBJF_KEEPBFD);
+  so->objfile = symbol_file_add_from_bfd (so->abfd, flags, sap, OBJF_SHARED);
   free_section_addr_info (sap);
 
   return;
@@ -489,12 +473,12 @@ solib_read_symbols (struct so_list *so, int flags)
 
   if (so->symbols_loaded)
     {
-      if (from_tty)
+      if (from_tty || info_verbose)
        printf_unfiltered (_("Symbols already loaded for %s\n"), so->so_name);
     }
   else if (so->abfd == NULL)
     {
-      if (from_tty)
+      if (from_tty || info_verbose)
        printf_unfiltered (_("Symbol file not found for %s\n"), so->so_name);
     }
   else
@@ -510,7 +494,7 @@ solib_read_symbols (struct so_list *so, int flags)
                              "Error while reading shared library symbols:\n");
           return 0;
         }
-      if (from_tty && print_symbol_loading)
+      if (from_tty || info_verbose)
         printf_unfiltered (_("Loaded symbols for %s\n"), so->so_name);
       so->symbols_loaded = 1;
       return 1;
@@ -801,52 +785,117 @@ solib_add (char *pattern, int from_tty, struct target_ops *target, int readsyms)
    DESCRIPTION
 
    Walk through the shared library list and print information
-   about each attached library.
+   about each attached library matching PATTERN.  If PATTERN is elided,
+   print them all.
  */
 
 static void
-info_sharedlibrary_command (char *ignore, int from_tty)
+info_sharedlibrary_command (char *pattern, int from_tty)
 {
   struct so_list *so = NULL;   /* link map state variable */
   int header_done = 0;
+  int so_missing_debug_info = 0;
   int addr_width;
+  int nr_libs;
+  struct cleanup *table_cleanup;
+  struct gdbarch *gdbarch = target_gdbarch;
+
+  if (pattern)
+    {
+      char *re_err = re_comp (pattern);
+
+      if (re_err)
+       error (_("Invalid regexp: %s"), re_err);
+    }
 
   /* "0x", a little whitespace, and two hex digits per byte of pointers.  */
-  addr_width = 4 + (gdbarch_ptr_bit (target_gdbarch) / 4);
+  addr_width = 4 + (gdbarch_ptr_bit (gdbarch) / 4);
 
   update_solib_list (from_tty, 0);
 
-  for (so = so_list_head; so; so = so->next)
+  /* make_cleanup_ui_out_table_begin_end needs to know the number of
+     rows, so we need to make two passes over the libs.  */
+
+  for (nr_libs = 0, so = so_list_head; so; so = so->next)
     {
       if (so->so_name[0])
        {
-         if (!header_done)
-           {
-             printf_unfiltered ("%-*s%-*s%-12s%s\n", addr_width, "From",
-                                addr_width, "To", "Syms Read",
-                                "Shared Object Library");
-             header_done++;
-           }
+         if (pattern && ! re_exec (so->so_name))
+           continue;
+         ++nr_libs;
+       }
+    }
+
+  table_cleanup =
+    make_cleanup_ui_out_table_begin_end (uiout, 4, nr_libs,
+                                        "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");
+
+  ui_out_table_body (uiout);
 
-         printf_unfiltered ("%-*s", addr_width,
-                            so->addr_high != 0
-                              ? hex_string_custom (
-                                  (LONGEST) so->addr_low,
-                                  addr_width - 4)
-                              : "");
-         printf_unfiltered ("%-*s", addr_width,
-                            so->addr_high != 0
-                              ? hex_string_custom (
-                                  (LONGEST) so->addr_high,
-                                  addr_width - 4)
-                              : "");
-         printf_unfiltered ("%-12s", so->symbols_loaded ? "Yes" : "No");
-         printf_unfiltered ("%s\n", so->so_name);
+  for (so = so_list_head; so; so = so->next)
+    {
+      struct cleanup *lib_cleanup;
+
+      if (! so->so_name[0])
+       continue;
+      if (pattern && ! re_exec (so->so_name))
+       continue;
+
+      lib_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "lib");
+
+      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);
+       }
+      else
+       {
+         ui_out_field_skip (uiout, "from");
+         ui_out_field_skip (uiout, "to");
+       }
+
+      if (! ui_out_is_mi_like_p (interp_ui_out (top_level_interpreter ()))
+         && so->symbols_loaded
+         && !objfile_has_partial_symbols (so->objfile)
+         && !objfile_has_full_symbols (so->objfile))
+       {
+         so_missing_debug_info = 1;
+         ui_out_field_string (uiout, "syms-read", "Yes (*)");
        }
+      else
+       ui_out_field_string (uiout, "syms-read", 
+                            so->symbols_loaded ? "Yes" : "No");
+
+      ui_out_field_string (uiout, "name", so->so_name);
+
+      ui_out_text (uiout, "\n");
+
+      do_cleanups (lib_cleanup);
     }
-  if (so_list_head == NULL)
+
+  do_cleanups (table_cleanup);
+
+  if (nr_libs == 0)
+    {
+      if (pattern)
+       ui_out_message (uiout, 0,
+                       _("No shared libraries matched.\n"));
+      else
+       ui_out_message (uiout, 0,
+                       _("No shared libraries loaded at this time.\n"));
+    }
+  else
     {
-      printf_unfiltered (_("No shared libraries loaded at this time.\n"));
+      if (so_missing_debug_info)
+       ui_out_message (uiout, 0,
+                       _("(*): Shared library is missing debugging information.\n"));
     }
 }
 
This page took 0.02667 seconds and 4 git commands to generate.