From 24ba069af8a2078bc634bbf2599381fc0ea471ad Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Tue, 24 Sep 2013 14:00:06 +0000 Subject: [PATCH] Keep objfile original filename gdb/ 2013-09-24 Jan Kratochvil Pass down original filename for objfile. * coffread.c (coff_symfile_read): Update symbol_file_add_separate call. * elfread.c (elf_symfile_read): Likewise. * jit.c (jit_object_close_impl): Update allocate_objfile call, no longer set ORIGINAL_NAME. (jit_bfd_try_read_symtab): Update symbol_file_add_from_bfd call. * jv-lang.c (get_dynamics_objfile): Update allocate_objfile call. * machoread.c (macho_add_oso_symfile): Add parameter name. Update symbol_file_add_from_bfd call. (macho_symfile_read_all_oso): Update two macho_add_oso_symfile calls. (macho_check_dsym): Add parameter filenamep. Change function comment. Set *filenamep. (macho_symfile_read): New variable dsym_filename. Update macho_check_dsym call. Use it for symbol_file_add_separate. * objfiles.c (allocate_objfile): Add parameter name. New comment for it. Use it for objfile->original_name. (objfile_name): Return OBFD's filename, if available. * objfiles.h (allocate_objfile): Add new parameter name. * solib.c (solib_read_symbols): Update symbol_file_add_from_bfd call. * symfile-mem.c (symbol_file_add_from_memory): Update symbol_file_add_from_bfd call. * symfile.c (read_symbols): Update symbol_file_add_separate call, new comment for it. (symbol_file_add_with_addrs): New parameter name, add function comment for it. Remove variable name. Update allocate_objfile call. (symbol_file_add_separate): New parameter name, add function comment for it. Update symbol_file_add_with_addrs call. (symbol_file_add_from_bfd): New parameter name. Update symbol_file_add_with_addrs call. (symbol_file_add): Update symbol_file_add_from_bfd call. (reread_symbols): New variable original_name. Save objfile->original_name by it. * symfile.h (symbol_file_add_from_bfd, symbol_file_add_separate): Add second parameter. --- gdb/ChangeLog | 37 +++++++++++++++++++++++++++++++++++++ gdb/coffread.c | 2 +- gdb/elfread.c | 2 +- gdb/jit.c | 7 +++---- gdb/jv-lang.c | 2 +- gdb/machoread.c | 26 ++++++++++++++++++-------- gdb/objfiles.c | 23 +++++++++++++++++------ gdb/objfiles.h | 2 +- gdb/solib.c | 2 +- gdb/symfile-mem.c | 3 ++- gdb/symfile.c | 41 ++++++++++++++++++++++++++++++----------- gdb/symfile.h | 5 +++-- 12 files changed, 115 insertions(+), 37 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6b9ff05e020..87bd03074c3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,40 @@ +2013-09-24 Jan Kratochvil + + Pass down original filename for objfile. + * coffread.c (coff_symfile_read): Update symbol_file_add_separate call. + * elfread.c (elf_symfile_read): Likewise. + * jit.c (jit_object_close_impl): Update allocate_objfile call, no + longer set ORIGINAL_NAME. + (jit_bfd_try_read_symtab): Update symbol_file_add_from_bfd call. + * jv-lang.c (get_dynamics_objfile): Update allocate_objfile call. + * machoread.c (macho_add_oso_symfile): Add parameter name. Update + symbol_file_add_from_bfd call. + (macho_symfile_read_all_oso): Update two macho_add_oso_symfile calls. + (macho_check_dsym): Add parameter filenamep. Change function comment. + Set *filenamep. + (macho_symfile_read): New variable dsym_filename. Update + macho_check_dsym call. Use it for symbol_file_add_separate. + * objfiles.c (allocate_objfile): Add parameter name. New comment for + it. Use it for objfile->original_name. + (objfile_name): Return OBFD's filename, if available. + * objfiles.h (allocate_objfile): Add new parameter name. + * solib.c (solib_read_symbols): Update symbol_file_add_from_bfd call. + * symfile-mem.c (symbol_file_add_from_memory): Update + symbol_file_add_from_bfd call. + * symfile.c (read_symbols): Update symbol_file_add_separate call, new + comment for it. + (symbol_file_add_with_addrs): New parameter name, add function comment + for it. Remove variable name. Update allocate_objfile call. + (symbol_file_add_separate): New parameter name, add function comment + for it. Update symbol_file_add_with_addrs call. + (symbol_file_add_from_bfd): New parameter name. Update + symbol_file_add_with_addrs call. + (symbol_file_add): Update symbol_file_add_from_bfd call. + (reread_symbols): New variable original_name. Save + objfile->original_name by it. + * symfile.h (symbol_file_add_from_bfd, symbol_file_add_separate): Add + second parameter. + 2013-09-24 Jan Kratochvil Code cleanup: Add objfile_name accessor function. diff --git a/gdb/coffread.c b/gdb/coffread.c index 1008f6d777e..e5151673979 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -738,7 +738,7 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags) bfd *abfd = symfile_bfd_open (debugfile); make_cleanup_bfd_unref (abfd); - symbol_file_add_separate (abfd, symfile_flags, objfile); + symbol_file_add_separate (abfd, debugfile, symfile_flags, objfile); } } diff --git a/gdb/elfread.c b/gdb/elfread.c index cbb55b1ecd0..1f9224a8aae 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -1458,7 +1458,7 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags) bfd *abfd = symfile_bfd_open (debugfile); make_cleanup_bfd_unref (abfd); - symbol_file_add_separate (abfd, symfile_flags, objfile); + symbol_file_add_separate (abfd, debugfile, symfile_flags, objfile); do_cleanups (cleanup); } } diff --git a/gdb/jit.c b/gdb/jit.c index ce66c9fabf5..c7edd4a3273 100644 --- a/gdb/jit.c +++ b/gdb/jit.c @@ -785,13 +785,11 @@ jit_object_close_impl (struct gdb_symbol_callbacks *cb, priv_data = cb->priv_data; - objfile = allocate_objfile (NULL, 0); + objfile = allocate_objfile (NULL, "<< JIT compiled code >>", 0); objfile->per_bfd->gdbarch = target_gdbarch (); terminate_minimal_symbol_table (objfile); - objfile->original_name = "<< JIT compiled code >>"; - j = NULL; for (i = obj->symtabs; i; i = j) { @@ -927,7 +925,8 @@ JITed symbol file is not an object file, ignoring it.\n")); /* This call does not take ownership of SAI. */ make_cleanup_bfd_unref (nbfd); - objfile = symbol_file_add_from_bfd (nbfd, 0, sai, OBJF_SHARED, NULL); + objfile = symbol_file_add_from_bfd (nbfd, bfd_get_filename (nbfd), 0, sai, + OBJF_SHARED, NULL); do_cleanups (old_cleanups); add_objfile_entry (objfile, entry_addr); diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c index bba94f28798..0d07bbd2913 100644 --- a/gdb/jv-lang.c +++ b/gdb/jv-lang.c @@ -118,7 +118,7 @@ get_dynamics_objfile (struct gdbarch *gdbarch) /* Mark it as shared so that it is cleared when the inferior is re-run. */ - dynamics_objfile = allocate_objfile (NULL, OBJF_SHARED); + dynamics_objfile = allocate_objfile (NULL, NULL, OBJF_SHARED); dynamics_objfile->per_bfd->gdbarch = gdbarch; data = XCNEW (struct jv_per_objfile_data); diff --git a/gdb/machoread.c b/gdb/machoread.c index 91cc69334d4..78af2f6e583 100644 --- a/gdb/machoread.c +++ b/gdb/machoread.c @@ -447,7 +447,7 @@ macho_resolve_oso_sym_with_minsym (struct objfile *main_objfile, asymbol *sym) /* Add oso file OSO/ABFD as a symbol file. */ static void -macho_add_oso_symfile (oso_el *oso, bfd *abfd, +macho_add_oso_symfile (oso_el *oso, bfd *abfd, const char *name, struct objfile *main_objfile, int symfile_flags) { int storage; @@ -636,7 +636,7 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd, from symfile.c:symbol_file_add_with_addrs_or_offsets. */ cleanup = make_cleanup_bfd_unref (abfd); symbol_file_add_from_bfd - (abfd, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), NULL, + (abfd, name, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), NULL, main_objfile->flags & (OBJF_REORDERED | OBJF_SHARED | OBJF_READNOW | OBJF_USERLOADED), main_objfile); @@ -736,6 +736,7 @@ macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr, member_len)) { macho_add_oso_symfile (oso2, member_bfd, + bfd_get_filename (member_bfd), main_objfile, symfile_flags); oso2->name = NULL; break; @@ -769,7 +770,8 @@ macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr, warning (_("`%s': can't open to read symbols: %s."), oso->name, bfd_errmsg (bfd_get_error ())); else - macho_add_oso_symfile (oso, abfd, main_objfile, symfile_flags); + macho_add_oso_symfile (oso, abfd, oso->name, main_objfile, + symfile_flags); ix++; } @@ -785,11 +787,13 @@ macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr, executable name and the executable base name to get the DSYM file name. */ #define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/" -/* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it. - Return NULL if no valid dsym file is found. */ +/* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it + and return *FILENAMEP with its original xmalloc-ated filename. + Return NULL if no valid dsym file is found (FILENAMEP is not used in + such case). */ static bfd * -macho_check_dsym (struct objfile *objfile) +macho_check_dsym (struct objfile *objfile, char **filenamep) { size_t name_len = strlen (objfile_name (objfile)); size_t dsym_len = strlen (DSYM_SUFFIX); @@ -842,6 +846,7 @@ macho_check_dsym (struct objfile *objfile) gdb_bfd_unref (dsym_bfd); return NULL; } + *filenamep = xstrdup (dsym_filename); return dsym_bfd; } @@ -860,6 +865,8 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags) be in the executable. */ if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC)) { + char *dsym_filename; + /* Process the normal symbol table first. */ storage_needed = bfd_get_symtab_upper_bound (objfile->obfd); if (storage_needed < 0) @@ -897,13 +904,15 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags) dwarf2_build_frame_info (objfile); /* Check for DSYM file. */ - dsym_bfd = macho_check_dsym (objfile); + dsym_bfd = macho_check_dsym (objfile, &dsym_filename); if (dsym_bfd != NULL) { int ix; oso_el *oso; struct bfd_section *asect, *dsect; + make_cleanup (xfree, dsym_filename); + if (mach_o_debug_level > 0) printf_unfiltered (_("dsym file found\n")); @@ -920,7 +929,8 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags) /* Add the dsym file as a separate file. */ make_cleanup_bfd_unref (dsym_bfd); - symbol_file_add_separate (dsym_bfd, symfile_flags, objfile); + symbol_file_add_separate (dsym_bfd, dsym_filename, symfile_flags, + objfile); /* Don't try to read dwarf2 from main file or shared libraries. */ do_cleanups (old_chain); diff --git a/gdb/objfiles.c b/gdb/objfiles.c index aae992fd30d..6585c3ff0ed 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -248,6 +248,11 @@ build_objfile_section_table (struct objfile *objfile) into the list of all known objfiles, and return a pointer to the new objfile struct. + NAME should contain original non-canonicalized filename or other + identifier as entered by user. If there is no better source use + bfd_get_filename (ABFD). NAME may be NULL only if ABFD is NULL. + NAME content is copied into returned objfile. + The FLAGS word contains various bits (OBJF_*) that can be taken as requests for specific operations. Other bits like OBJF_SHARED are simply copied through to the new objfile flags member. */ @@ -262,7 +267,7 @@ build_objfile_section_table (struct objfile *objfile) things in a consistent state even if abfd is NULL. */ struct objfile * -allocate_objfile (bfd *abfd, int flags) +allocate_objfile (bfd *abfd, const char *name, int flags) { struct objfile *objfile; @@ -279,20 +284,23 @@ allocate_objfile (bfd *abfd, int flags) that any data that is reference is saved in the per-objfile data region. */ + if (name == NULL) + { + gdb_assert (abfd == NULL); + name = "<>"; + } + objfile->original_name = obstack_copy0 (&objfile->objfile_obstack, name, + strlen (name)); + objfile->obfd = abfd; gdb_bfd_ref (abfd); if (abfd != NULL) { - objfile->original_name = bfd_get_filename (abfd); objfile->mtime = bfd_get_mtime (abfd); /* Build section table. */ build_objfile_section_table (objfile); } - else - { - objfile->original_name = "<>"; - } objfile->per_bfd = get_objfile_bfd_data (objfile, abfd); objfile->pspace = current_program_space; @@ -1486,6 +1494,9 @@ default_iterate_over_objfiles_in_search_order const char * objfile_name (const struct objfile *objfile) { + if (objfile->obfd != NULL) + return bfd_get_filename (objfile->obfd); + return objfile->original_name; } diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 8467aa4143b..9644784f0fa 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -431,7 +431,7 @@ struct objfile /* Declarations for functions defined in objfiles.c */ -extern struct objfile *allocate_objfile (bfd *, int); +extern struct objfile *allocate_objfile (bfd *, const char *name, int); extern struct gdbarch *get_objfile_arch (struct objfile *); diff --git a/gdb/solib.c b/gdb/solib.c index 98833a509ee..2b3d4564001 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -610,7 +610,7 @@ solib_read_symbols (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, + so->objfile = symbol_file_add_from_bfd (so->abfd, so->so_name, flags, sap, OBJF_SHARED, NULL); so->objfile->addr_low = so->addr_low; diff --git a/gdb/symfile-mem.c b/gdb/symfile-mem.c index e148d09a8e0..2a49c5461ac 100644 --- a/gdb/symfile-mem.c +++ b/gdb/symfile-mem.c @@ -129,7 +129,8 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name, } sai->num_sections = i; - objf = symbol_file_add_from_bfd (nbfd, from_tty ? SYMFILE_VERBOSE : 0, + objf = symbol_file_add_from_bfd (nbfd, bfd_get_filename (nbfd), + from_tty ? SYMFILE_VERBOSE : 0, sai, OBJF_SHARED, NULL); /* This might change our ideas about frames already looked at. */ diff --git a/gdb/symfile.c b/gdb/symfile.c index 287c8feb630..9f76c5e0f1c 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -839,7 +839,14 @@ read_symbols (struct objfile *objfile, int add_flags) struct cleanup *cleanup = make_cleanup_bfd_unref (abfd); if (abfd != NULL) - symbol_file_add_separate (abfd, add_flags, objfile); + { + /* find_separate_debug_file_in_section uses the same filename for the + virtual section-as-bfd like the bfd filename containing the + section. Therefore use also non-canonical name form for the same + file containing the section. */ + symbol_file_add_separate (abfd, objfile->original_name, add_flags, + objfile); + } do_cleanups (cleanup); } @@ -1047,6 +1054,8 @@ new_symfile_objfile (struct objfile *objfile, int add_flags) ABFD is a BFD already open on the file, as from symfile_bfd_open. A new reference is acquired by this function. + For NAME description see allocate_objfile's definition. + ADD_FLAGS encodes verbosity, whether this is main symbol file or extra, such as dynamically loaded code, and what to do with breakpoins. @@ -1060,12 +1069,11 @@ new_symfile_objfile (struct objfile *objfile, int add_flags) Upon failure, jumps back to command level (never returns). */ static struct objfile * -symbol_file_add_with_addrs (bfd *abfd, int add_flags, +symbol_file_add_with_addrs (bfd *abfd, const char *name, int add_flags, struct section_addr_info *addrs, int flags, struct objfile *parent) { struct objfile *objfile; - const char *name = bfd_get_filename (abfd); const int from_tty = add_flags & SYMFILE_VERBOSE; const int mainline = add_flags & SYMFILE_MAINLINE; const int should_print = ((from_tty || info_verbose) @@ -1087,7 +1095,8 @@ symbol_file_add_with_addrs (bfd *abfd, int add_flags, && !query (_("Load new symbol table from \"%s\"? "), name)) error (_("Not confirmed.")); - objfile = allocate_objfile (abfd, flags | (mainline ? OBJF_MAINLINE : 0)); + objfile = allocate_objfile (abfd, name, + flags | (mainline ? OBJF_MAINLINE : 0)); if (parent) add_separate_debug_objfile (objfile, parent); @@ -1160,10 +1169,12 @@ symbol_file_add_with_addrs (bfd *abfd, int add_flags, return (objfile); } -/* Add BFD as a separate debug file for OBJFILE. */ +/* Add BFD as a separate debug file for OBJFILE. For NAME description + see allocate_objfile's definition. */ void -symbol_file_add_separate (bfd *bfd, int symfile_flags, struct objfile *objfile) +symbol_file_add_separate (bfd *bfd, const char *name, int symfile_flags, + struct objfile *objfile) { struct objfile *new_objfile; struct section_addr_info *sap; @@ -1176,7 +1187,7 @@ symbol_file_add_separate (bfd *bfd, int symfile_flags, struct objfile *objfile) my_cleanup = make_cleanup_free_section_addr_info (sap); new_objfile = symbol_file_add_with_addrs - (bfd, symfile_flags, sap, + (bfd, name, symfile_flags, sap, objfile->flags & (OBJF_REORDERED | OBJF_SHARED | OBJF_READNOW | OBJF_USERLOADED), objfile); @@ -1189,11 +1200,12 @@ symbol_file_add_separate (bfd *bfd, int symfile_flags, struct objfile *objfile) See symbol_file_add_with_addrs's comments for details. */ struct objfile * -symbol_file_add_from_bfd (bfd *abfd, int add_flags, +symbol_file_add_from_bfd (bfd *abfd, const char *name, int add_flags, struct section_addr_info *addrs, int flags, struct objfile *parent) { - return symbol_file_add_with_addrs (abfd, add_flags, addrs, flags, parent); + return symbol_file_add_with_addrs (abfd, name, add_flags, addrs, flags, + parent); } /* Process a symbol file, as either the main file or as a dynamically @@ -1207,7 +1219,7 @@ symbol_file_add (const char *name, int add_flags, struct cleanup *cleanup = make_cleanup_bfd_unref (bfd); struct objfile *objf; - objf = symbol_file_add_from_bfd (bfd, add_flags, addrs, flags, NULL); + objf = symbol_file_add_from_bfd (bfd, name, add_flags, addrs, flags, NULL); do_cleanups (cleanup); return objf; } @@ -2372,6 +2384,7 @@ reread_symbols (void) struct cleanup *old_cleanups; struct section_offsets *offsets; int num_offsets; + char *original_name; printf_unfiltered (_("`%s' has changed; re-reading symbols.\n"), objfile_name (objfile)); @@ -2442,7 +2455,9 @@ reread_symbols (void) gdb_bfd_unref (obfd); } - objfile->original_name = bfd_get_filename (objfile->obfd); + original_name = xstrdup (objfile->original_name); + make_cleanup (xfree, original_name); + /* 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 (objfile), @@ -2496,6 +2511,10 @@ reread_symbols (void) gdb_obstack.h specifies the alloc/dealloc functions. */ obstack_init (&objfile->objfile_obstack); + objfile->original_name = obstack_copy0 (&objfile->objfile_obstack, + original_name, + strlen (original_name)); + /* Reset the sym_fns pointer. The ELF reader can change it based on whether .gdb_index is present, and we need it to start over. PR symtab/15885 */ diff --git a/gdb/symfile.h b/gdb/symfile.h index 9d2418409b1..ac5b711116e 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -480,11 +480,12 @@ extern void new_symfile_objfile (struct objfile *, int); extern struct objfile *symbol_file_add (const char *, int, struct section_addr_info *, int); -extern struct objfile *symbol_file_add_from_bfd (bfd *, int, +extern struct objfile *symbol_file_add_from_bfd (bfd *, const char *, int, struct section_addr_info *, int, struct objfile *parent); -extern void symbol_file_add_separate (bfd *, int, struct objfile *); +extern void symbol_file_add_separate (bfd *, const char *, int, + struct objfile *); extern char *find_separate_debug_file_by_debuglink (struct objfile *); -- 2.30.2