diff options
author | Tom Tromey <tromey@redhat.com> | 2012-07-18 19:34:57 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2012-07-18 19:34:57 +0000 |
commit | a4453b7e0b9b84dd18c844ef43fbb9f6e2e75433 (patch) | |
tree | 86d872256f3fb47092c6660448c7f7655748e2b7 /gdb/symfile.c | |
parent | cbb099e88685f8aa80b9a958ba35988d8dbb8721 (diff) | |
download | binutils-a4453b7e0b9b84dd18c844ef43fbb9f6e2e75433.tar.gz binutils-a4453b7e0b9b84dd18c844ef43fbb9f6e2e75433.tar.bz2 binutils-a4453b7e0b9b84dd18c844ef43fbb9f6e2e75433.zip |
* symfile.c (symfile_bfd_open): Don't copy name. Call
gdb_bfd_stash_filename.
(load_command): Open the new BFD before freeing the old.
(bfd_open_maybe_remote): Call gdb_bfd_stash_filename.
* symfile-mem.c (symbol_file_add_from_memory): Don't copy name.
Call gdb_bfd_stash_filename.
* spu-linux-nat.c (spu_bfd_open): Don't copy name.
* solib-spu.c (spu_bfd_fopen): Don't copy name. Call
gdb_bfd_stash_filename.
* solib-darwin.c (darwin_solib_get_all_image_info_addr_at_init):
Free found_pathname.
* rs6000-nat.c (add_vmap): Don't copy filename. Call
gdb_bfd_stash_filename.
* remote.c (remote_bfd_open): Call gdb_bfd_stash_filename.
* machoread.c (macho_add_oso_symfile): Call
gdb_bfd_stash_filename.
(macho_symfile_read_all_oso): Arrange to free archive_name. Call
gdb_bfd_stash_filename.
(macho_check_dsym): Don't copy filename. Call
gdb_bfd_stash_filename.
* jit.c (bfd_open_from_target_memory): Don't copy the filename.
* gdb_bfd.c (gdb_bfd_stash_filename): New function.
* gdb_bfd.h (gdb_bfd_stash_filename): Declare.
* gcore.c (create_gcore_bfd): Call gdb_bfd_stash_filename.
* exec.c (exec_close): Don't free the BFD's filename.
(exec_file_attach): Don't copy the filename. Call
gdb_bfd_stash_filename.
* corelow.c (core_close): Don't free the BFD's filename.
(core_open): Call gdb_bfd_stash_filename.
* corefile.c (reopen_exec_file): Remove #if 0 code.
* solib.c (solib_bfd_fopen): Call gdb_bfd_stash_filename. Free
pathname.
* dwarf2read.c (try_open_dwo_file): Call gdb_bfd_stash_filename.
Diffstat (limited to 'gdb/symfile.c')
-rw-r--r-- | gdb/symfile.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/gdb/symfile.c b/gdb/symfile.c index 2ad72c5b1e4..99427aeb28f 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -1700,7 +1700,13 @@ bfd_open_maybe_remote (const char *name) if (remote_filename_p (name)) return gdb_bfd_ref (remote_bfd_open (name, gnutarget)); else - return gdb_bfd_ref (bfd_openr (name, gnutarget)); + { + bfd *result = gdb_bfd_ref (bfd_openr (name, gnutarget)); + + if (result != NULL) + gdb_bfd_stash_filename (result); + return result; + } } @@ -1718,19 +1724,14 @@ symfile_bfd_open (char *name) if (remote_filename_p (name)) { - name = xstrdup (name); sym_bfd = gdb_bfd_ref (remote_bfd_open (name, gnutarget)); if (!sym_bfd) - { - make_cleanup (xfree, name); - error (_("`%s': can't open to read symbols: %s."), name, - bfd_errmsg (bfd_get_error ())); - } + error (_("`%s': can't open to read symbols: %s."), name, + bfd_errmsg (bfd_get_error ())); if (!bfd_check_format (sym_bfd, bfd_object)) { - gdb_bfd_unref (sym_bfd); - make_cleanup (xfree, name); + make_cleanup_bfd_close (sym_bfd); error (_("`%s': can't read symbols: %s."), name, bfd_errmsg (bfd_get_error ())); } @@ -1759,10 +1760,9 @@ symfile_bfd_open (char *name) perror_with_name (name); } - /* Free 1st new malloc'd copy, but keep the 2nd malloc'd copy in - bfd. It'll be freed in free_objfile(). */ xfree (name); name = absolute_name; + make_cleanup (xfree, name); sym_bfd = gdb_bfd_ref (bfd_fopen (name, gnutarget, FOPEN_RB, desc)); if (!sym_bfd) @@ -1776,11 +1776,12 @@ symfile_bfd_open (char *name) if (!bfd_check_format (sym_bfd, bfd_object)) { make_cleanup_bfd_close (sym_bfd); - make_cleanup (xfree, name); error (_("`%s': can't read symbols: %s."), name, bfd_errmsg (bfd_get_error ())); } + gdb_bfd_stash_filename (sym_bfd); + return sym_bfd; } @@ -2511,9 +2512,16 @@ reread_symbols (void) /* Clean up any state BFD has sitting around. We don't need to close the descriptor but BFD lacks a way of closing the BFD without closing the descriptor. */ - obfd_filename = bfd_get_filename (objfile->obfd); - gdb_bfd_unref (objfile->obfd); - objfile->obfd = bfd_open_maybe_remote (obfd_filename); + { + struct bfd *obfd = objfile->obfd; + + obfd_filename = bfd_get_filename (objfile->obfd); + /* Open the new BFD before freeing the old one, so that + the filename remains live. */ + objfile->obfd = bfd_open_maybe_remote (obfd_filename); + gdb_bfd_unref (obfd); + } + if (objfile->obfd == NULL) error (_("Can't open %s to read symbols."), objfile->name); /* bfd_openr sets cacheable to true, which is what we want. */ |