diff options
Diffstat (limited to 'gdb/solib.c')
-rw-r--r-- | gdb/solib.c | 126 |
1 files changed, 96 insertions, 30 deletions
diff --git a/gdb/solib.c b/gdb/solib.c index 8e86769..c7fd0fc 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -46,6 +46,7 @@ #include "readline/readline.h" #include "remote.h" #include "solib.h" +#include "interps.h" /* Architecture-specific operations. */ @@ -472,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 @@ -493,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; @@ -784,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); + + for (so = so_list_head; so; so = so->next) + { + struct cleanup *lib_cleanup; - 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); + 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")); } } |