X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsymfile.c;h=75cb0f8e999b6b1c38c263dd4cbbbf52db305a49;hb=287ccc17edcb68ea6ba15be621e72e5bf7f46038;hp=968c8a85a17ab6ba50a86dc809d493e3b121b5a8;hpb=69de3c6af9e2484e4ac27d2a79fa2abb25b552d9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/symfile.c b/gdb/symfile.c index 968c8a85a1..75cb0f8e99 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -22,6 +22,7 @@ along with this program. If not, see . */ #include "defs.h" +#include "arch-utils.h" #include "bfdlink.h" #include "symtab.h" #include "gdbtypes.h" @@ -128,7 +129,8 @@ static void overlay_command (char *, int); static void simple_free_overlay_table (void); -static void read_target_long_array (CORE_ADDR, unsigned int *, int, int); +static void read_target_long_array (CORE_ADDR, unsigned int *, int, int, + enum bfd_endian); static int simple_read_overlay_table (void); @@ -169,13 +171,6 @@ Dynamic symbol table reloading multiple times in one run is %s.\n"), value); } -/* If non-zero, gdb will notify the user when it is loading symbols - from a file. This is almost always what users will want to have happen; - but for programs with lots of dynamically linked libraries, the output - can be more noise than signal. */ - -int print_symbol_loading = 1; - /* If non-zero, shared library symbols will be added automatically when the inferior is created, new libraries are loaded, or when attaching to the inferior. This is almost always what users will @@ -791,7 +786,7 @@ syms_from_objfile (struct objfile *objfile, if (symfile_objfile != NULL) { free_objfile (symfile_objfile); - symfile_objfile = NULL; + gdb_assert (symfile_objfile == NULL); } /* Currently we keep symbols from the add-symbol-file command. @@ -987,12 +982,9 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, deprecated_pre_add_symbol_hook (name); else { - if (print_symbol_loading) - { - printf_unfiltered (_("Reading symbols from %s..."), name); - wrap_here (""); - gdb_flush (gdb_stdout); - } + printf_unfiltered (_("Reading symbols from %s..."), name); + wrap_here (""); + gdb_flush (gdb_stdout); } } syms_from_objfile (objfile, addrs, offsets, num_offsets, @@ -1005,7 +997,7 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, if ((flags & OBJF_READNOW) || readnow_symbol_files) { - if ((from_tty || info_verbose) && print_symbol_loading) + if (from_tty || info_verbose) { printf_unfiltered (_("expanding to full symbols...")); wrap_here (""); @@ -1047,15 +1039,11 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, xfree (debugfile); } - if (!have_partial_symbols () && !have_full_symbols () - && print_symbol_loading) + if ((from_tty || info_verbose) + && !objfile_has_symbols (objfile)) { wrap_here (""); - printf_unfiltered (_("(no debugging symbols found)")); - if (from_tty || info_verbose) - printf_unfiltered ("..."); - else - printf_unfiltered ("\n"); + printf_unfiltered (_("(no debugging symbols found)...")); wrap_here (""); } @@ -1064,10 +1052,7 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, if (deprecated_post_add_symbol_hook) deprecated_post_add_symbol_hook (); else - { - if (print_symbol_loading) - printf_unfiltered (_("done.\n")); - } + printf_unfiltered (_("done.\n")); } /* We print some messages regardless of whether 'from_tty || @@ -1078,7 +1063,10 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, do_cleanups (my_cleanups); if (objfile->sf == NULL) - return objfile; /* No symbols. */ + { + observer_notify_new_objfile (objfile); + return objfile; /* No symbols. */ + } new_symfile_objfile (objfile, add_flags); @@ -1161,7 +1149,7 @@ symbol_file_clear (int from_tty) descriptors as well. */ no_shared_libraries (NULL, from_tty); - symfile_objfile = NULL; + gdb_assert (symfile_objfile == NULL); if (from_tty) printf_unfiltered (_("No symbol file now.\n")); } @@ -1295,7 +1283,8 @@ get_debug_link_info (struct objfile *objfile, unsigned long *crc32_out) } static int -separate_debug_file_exists (const char *name, unsigned long crc) +separate_debug_file_exists (const char *name, unsigned long crc, + const char *parent_name) { unsigned long file_crc = 0; bfd *abfd; @@ -1315,7 +1304,15 @@ separate_debug_file_exists (const char *name, unsigned long crc) bfd_close (abfd); - return crc == file_crc; + if (crc != file_crc) + { + warning (_("the debug information found in \"%s\"" + " does not match \"%s\" (CRC mismatch).\n"), + name, parent_name); + return 0; + } + + return 1; } char *debug_file_directory = NULL; @@ -1367,6 +1364,8 @@ find_separate_debug_file (struct objfile *objfile) basename = get_debug_link_info (objfile, &crc32); if (basename == NULL) + /* There's no separate debug info, hence there's no way we could + load it => no warning. */ return NULL; dir = xstrdup (objfile->name); @@ -1383,8 +1382,14 @@ find_separate_debug_file (struct objfile *objfile) gdb_assert (i >= 0 && IS_DIR_SEPARATOR (dir[i])); dir[i+1] = '\0'; + /* Set I to max (strlen (canon_name), strlen (dir)). */ + canon_name = lrealpath (dir); + i = strlen (dir); + if (canon_name && strlen (canon_name) > i) + i = strlen (canon_name); + debugfile = alloca (strlen (debug_file_directory) + 1 - + strlen (dir) + + i + strlen (DEBUG_SUBDIRECTORY) + strlen ("/") + strlen (basename) @@ -1394,10 +1399,11 @@ find_separate_debug_file (struct objfile *objfile) strcpy (debugfile, dir); strcat (debugfile, basename); - if (separate_debug_file_exists (debugfile, crc32)) + if (separate_debug_file_exists (debugfile, crc32, objfile->name)) { xfree (basename); xfree (dir); + xfree (canon_name); return xstrdup (debugfile); } @@ -1407,10 +1413,11 @@ find_separate_debug_file (struct objfile *objfile) strcat (debugfile, "/"); strcat (debugfile, basename); - if (separate_debug_file_exists (debugfile, crc32)) + if (separate_debug_file_exists (debugfile, crc32, objfile->name)) { xfree (basename); xfree (dir); + xfree (canon_name); return xstrdup (debugfile); } @@ -1420,16 +1427,16 @@ find_separate_debug_file (struct objfile *objfile) strcat (debugfile, dir); strcat (debugfile, basename); - if (separate_debug_file_exists (debugfile, crc32)) + if (separate_debug_file_exists (debugfile, crc32, objfile->name)) { xfree (basename); xfree (dir); + xfree (canon_name); return xstrdup (debugfile); } /* If the file is in the sysroot, try using its base path in the global debugfile directory. */ - canon_name = lrealpath (dir); if (canon_name && strncmp (canon_name, gdb_sysroot, strlen (gdb_sysroot)) == 0 && IS_DIR_SEPARATOR (canon_name[strlen (gdb_sysroot)])) @@ -1439,7 +1446,7 @@ find_separate_debug_file (struct objfile *objfile) strcat (debugfile, "/"); strcat (debugfile, basename); - if (separate_debug_file_exists (debugfile, crc32)) + if (separate_debug_file_exists (debugfile, crc32, objfile->name)) { xfree (canon_name); xfree (basename); @@ -1624,6 +1631,9 @@ symfile_bfd_open (char *name) bfd_errmsg (bfd_get_error ())); } + /* bfd_usrdata exists for applications and libbfd must not touch it. */ + gdb_assert (bfd_usrdata (sym_bfd) == NULL); + return sym_bfd; } @@ -1799,9 +1809,9 @@ load_progress (ULONGEST bytes, void *untyped_arg) { /* The write is just starting. Let the user know we've started this section. */ - ui_out_message (uiout, 0, "Loading section %s, size 0x%s lma 0x%s\n", - args->section_name, paddr_nz (args->section_size), - paddr_nz (args->lma)); + ui_out_message (uiout, 0, "Loading section %s, size %s lma %s\n", + args->section_name, hex_string (args->section_size), + paddress (target_gdbarch, args->lma)); return; } @@ -1818,11 +1828,11 @@ load_progress (ULONGEST bytes, void *untyped_arg) struct cleanup *verify_cleanups = make_cleanup (xfree, check); if (target_read_memory (args->lma, check, bytes) != 0) - error (_("Download verify read failed at 0x%s"), - paddr (args->lma)); + error (_("Download verify read failed at %s"), + paddress (target_gdbarch, args->lma)); if (memcmp (args->buffer, check, bytes) != 0) - error (_("Download verify compare failed at 0x%s"), - paddr (args->lma)); + error (_("Download verify compare failed at %s"), + paddress (target_gdbarch, args->lma)); do_cleanups (verify_cleanups); } totals->data_count += bytes; @@ -1978,7 +1988,7 @@ generic_load (char *args, int from_tty) entry = bfd_get_start_address (loadfile_bfd); ui_out_text (uiout, "Start address "); - ui_out_field_fmt (uiout, "address", "0x%s", paddr_nz (entry)); + ui_out_field_fmt (uiout, "address", "%s", paddress (target_gdbarch, entry)); ui_out_text (uiout, ", load size "); ui_out_field_fmt (uiout, "load-size", "%lu", total_progress.data_count); ui_out_text (uiout, "\n"); @@ -2080,6 +2090,7 @@ print_transfer_performance (struct ui_file *stream, static void add_symbol_file_command (char *args, int from_tty) { + struct gdbarch *gdbarch = get_current_arch (); char *filename = NULL; int flags = OBJF_USERLOADED; char *arg; @@ -2210,7 +2221,8 @@ add_symbol_file_command (char *args, int from_tty) entered on the command line. */ section_addrs->other[sec_num].name = sec; section_addrs->other[sec_num].addr = addr; - printf_unfiltered ("\t%s_addr = %s\n", sec, paddress (addr)); + printf_unfiltered ("\t%s_addr = %s\n", sec, + paddress (gdbarch, addr)); sec_num++; /* The object's sections are initialized when a @@ -2315,6 +2327,8 @@ reread_symbols (void) objfile->obfd = bfd_openr (obfd_filename, gnutarget); if (objfile->obfd == NULL) error (_("Can't open %s to read symbols."), objfile->name); + else + objfile->obfd = gdb_bfd_ref (objfile->obfd); /* bfd_openr sets cacheable to true, which is what we want. */ if (!bfd_check_format (objfile->obfd, bfd_object)) error (_("Can't read symbols from %s: %s."), objfile->name, @@ -2334,7 +2348,16 @@ reread_symbols (void) /* Nuke all the state that we will re-read. Much of the following code which sets things to NULL really is necessary to tell - other parts of GDB that there is nothing currently there. */ + other parts of GDB that there is nothing currently there. + + Try to keep the freeing order compatible with free_objfile. */ + + if (objfile->sf != NULL) + { + (*objfile->sf->sym_finish) (objfile); + } + + clear_objfile_data (objfile); /* FIXME: Do we have to free a whole linked list, or is this enough? */ @@ -2371,11 +2394,6 @@ reread_symbols (void) sizeof (objfile->msymbol_hash)); memset (&objfile->msymbol_demangled_hash, 0, sizeof (objfile->msymbol_demangled_hash)); - clear_objfile_data (objfile); - if (objfile->sf != NULL) - { - (*objfile->sf->sym_finish) (objfile); - } objfile->psymbol_cache = bcache_xmalloc (); objfile->macro_cache = bcache_xmalloc (); @@ -2414,7 +2432,7 @@ reread_symbols (void) zero is OK since dbxread.c also does what it needs to do if objfile->global_psymbols.size is 0. */ (*objfile->sf->sym_read) (objfile, 0); - if (!have_partial_symbols () && !have_full_symbols ()) + if (!objfile_has_symbols (objfile)) { wrap_here (""); printf_unfiltered (_("(no debugging symbols found)\n")); @@ -2445,12 +2463,14 @@ reread_symbols (void) if (reread_one) { + /* Notify objfiles that we've modified objfile sections. */ + objfiles_changed (); + clear_symtab_users (); /* At least one objfile has changed, so we can consider that the executable we're debugging has changed too. */ observer_notify_executable_changed (); } - } @@ -2798,7 +2818,7 @@ clear_symtab_users (void) clear_displays (); breakpoint_re_set (); - set_default_breakpoint (0, 0, 0, 0); + set_default_breakpoint (0, NULL, 0, 0, 0); clear_pc_function_cache (); observer_notify_new_objfile (NULL); @@ -3498,6 +3518,7 @@ list_overlays_command (char *args, int from_tty) ALL_OBJSECTIONS (objfile, osect) if (section_is_mapped (osect)) { + struct gdbarch *gdbarch = get_objfile_arch (objfile); const char *name; bfd_vma lma, vma; int size; @@ -3508,13 +3529,13 @@ list_overlays_command (char *args, int from_tty) name = bfd_section_name (objfile->obfd, osect->the_bfd_section); printf_filtered ("Section %s, loaded at ", name); - fputs_filtered (paddress (lma), gdb_stdout); + fputs_filtered (paddress (gdbarch, lma), gdb_stdout); puts_filtered (" - "); - fputs_filtered (paddress (lma + size), gdb_stdout); + fputs_filtered (paddress (gdbarch, lma + size), gdb_stdout); printf_filtered (", mapped at "); - fputs_filtered (paddress (vma), gdb_stdout); + fputs_filtered (paddress (gdbarch, vma), gdb_stdout); puts_filtered (" - "); - fputs_filtered (paddress (vma + size), gdb_stdout); + fputs_filtered (paddress (gdbarch, vma + size), gdb_stdout); puts_filtered ("\n"); nmapped++; @@ -3639,8 +3660,10 @@ overlay_off_command (char *args, int from_tty) static void overlay_load_command (char *args, int from_tty) { - if (gdbarch_overlay_update_p (current_gdbarch)) - gdbarch_overlay_update (current_gdbarch, NULL); + struct gdbarch *gdbarch = get_current_arch (); + + if (gdbarch_overlay_update_p (gdbarch)) + gdbarch_overlay_update (gdbarch, NULL); else error (_("This target does not know how to read its overlay state.")); } @@ -3740,7 +3763,7 @@ simple_free_overlay_region_table (void) Convert to host order. int LEN is number of ints */ static void read_target_long_array (CORE_ADDR memaddr, unsigned int *myaddr, - int len, int size) + int len, int size, enum bfd_endian byte_order) { /* FIXME (alloca): Not safe if array is very large. */ gdb_byte *buf = alloca (len * size); @@ -3748,7 +3771,7 @@ read_target_long_array (CORE_ADDR memaddr, unsigned int *myaddr, read_memory (memaddr, buf, len * size); for (i = 0; i < len; i++) - myaddr[i] = extract_unsigned_integer (size * i + buf, size); + myaddr[i] = extract_unsigned_integer (size * i + buf, size, byte_order); } /* Find and grab a copy of the target _ovly_table @@ -3759,6 +3782,7 @@ simple_read_overlay_table (void) struct minimal_symbol *novlys_msym, *ovly_table_msym; struct gdbarch *gdbarch; int word_size; + enum bfd_endian byte_order; simple_free_overlay_table (); novlys_msym = lookup_minimal_symbol ("_novlys", NULL, NULL); @@ -3781,14 +3805,16 @@ simple_read_overlay_table (void) gdbarch = get_objfile_arch (msymbol_objfile (ovly_table_msym)); word_size = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; + byte_order = gdbarch_byte_order (gdbarch); - cache_novlys = read_memory_integer (SYMBOL_VALUE_ADDRESS (novlys_msym), 4); + cache_novlys = read_memory_integer (SYMBOL_VALUE_ADDRESS (novlys_msym), + 4, byte_order); cache_ovly_table = (void *) xmalloc (cache_novlys * sizeof (*cache_ovly_table)); cache_ovly_table_base = SYMBOL_VALUE_ADDRESS (ovly_table_msym); read_target_long_array (cache_ovly_table_base, (unsigned int *) cache_ovly_table, - cache_novlys * 4, word_size); + cache_novlys * 4, word_size, byte_order); return 1; /* SUCCESS */ } @@ -3800,25 +3826,33 @@ static int simple_read_overlay_region_table (void) { struct minimal_symbol *msym; + struct gdbarch *gdbarch; + int word_size; + enum bfd_endian byte_order; simple_free_overlay_region_table (); msym = lookup_minimal_symbol ("_novly_regions", NULL, NULL); - if (msym != NULL) - cache_novly_regions = read_memory_integer (SYMBOL_VALUE_ADDRESS (msym), 4); - else + if (msym == NULL) return 0; /* failure */ + + gdbarch = get_objfile_arch (msymbol_objfile (msym)); + word_size = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; + byte_order = gdbarch_byte_order (gdbarch); + + cache_novly_regions = read_memory_integer (SYMBOL_VALUE_ADDRESS (msym), + 4, byte_order); + cache_ovly_region_table = (void *) xmalloc (cache_novly_regions * 12); if (cache_ovly_region_table != NULL) { msym = lookup_minimal_symbol ("_ovly_region_table", NULL, NULL); if (msym != NULL) { - struct gdbarch *gdbarch = get_objfile_arch (msymbol_objfile (msym)); - int word_size = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; cache_ovly_region_table_base = SYMBOL_VALUE_ADDRESS (msym); read_target_long_array (cache_ovly_region_table_base, (unsigned int *) cache_ovly_region_table, - cache_novly_regions * 3, word_size); + cache_novly_regions * 3, + word_size, byte_order); } else return 0; /* failure */ @@ -3845,6 +3879,7 @@ simple_overlay_update_1 (struct obj_section *osect) asection *bsect = osect->the_bfd_section; struct gdbarch *gdbarch = get_objfile_arch (osect->objfile); int word_size = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); size = bfd_get_section_size (osect->the_bfd_section); for (i = 0; i < cache_novlys; i++) @@ -3854,7 +3889,7 @@ simple_overlay_update_1 (struct obj_section *osect) { read_target_long_array (cache_ovly_table_base + i * word_size, (unsigned int *) cache_ovly_table[i], - 4, word_size); + 4, word_size, byte_order); if (cache_ovly_table[i][VMA] == bfd_section_vma (obfd, bsect) && cache_ovly_table[i][LMA] == bfd_section_lma (obfd, bsect) /* && cache_ovly_table[i][SIZE] == size */ ) @@ -4166,12 +4201,4 @@ the global debug-file directory prepended."), NULL, show_debug_file_directory, &setlist, &showlist); - - add_setshow_boolean_cmd ("symbol-loading", no_class, - &print_symbol_loading, _("\ -Set printing of symbol loading messages."), _("\ -Show printing of symbol loading messages."), NULL, - NULL, - NULL, - &setprintlist, &showprintlist); }