| Index: gdb/symfile-mem.c
|
| diff --git a/gdb/symfile-mem.c b/gdb/symfile-mem.c
|
| index e80fd250a4ed88efec87cace092930a84c17dc8a..2a49c5461ac0b53466546260a4ecb737f298b706 100644
|
| --- a/gdb/symfile-mem.c
|
| +++ b/gdb/symfile-mem.c
|
| @@ -1,7 +1,6 @@
|
| /* Reading symbol files from memory.
|
|
|
| - Copyright (C) 1986-1987, 1989, 1991, 1994-1996, 1998, 2000-2005,
|
| - 2007-2012 Free Software Foundation, Inc.
|
| + Copyright (C) 1986-2013 Free Software Foundation, Inc.
|
|
|
| This file is part of GDB.
|
|
|
| @@ -54,6 +53,7 @@
|
| #include "observer.h"
|
| #include "auxv.h"
|
| #include "elf/common.h"
|
| +#include "gdb_bfd.h"
|
|
|
| /* Verify parameters of target_read_memory_bfd and target_read_memory are
|
| compatible. */
|
| @@ -100,23 +100,24 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
|
| if (nbfd == NULL)
|
| error (_("Failed to read a valid object file image from memory."));
|
|
|
| + gdb_bfd_ref (nbfd);
|
| if (name == NULL)
|
| - nbfd->filename = xstrdup ("shared object read from target memory");
|
| + nbfd->filename = "shared object read from target memory";
|
| else
|
| - nbfd->filename = name;
|
| -
|
| - if (!bfd_check_format (nbfd, bfd_object))
|
| {
|
| - /* FIXME: should be checking for errors from bfd_close (for one thing,
|
| - on error it does not free all the storage associated with the
|
| - bfd). */
|
| - bfd_close (nbfd);
|
| - error (_("Got object file from memory but can't read symbols: %s."),
|
| - bfd_errmsg (bfd_get_error ()));
|
| + nbfd->filename = name;
|
| + gdb_bfd_stash_filename (nbfd);
|
| + xfree (name);
|
| }
|
|
|
| + cleanup = make_cleanup_bfd_unref (nbfd);
|
| +
|
| + if (!bfd_check_format (nbfd, bfd_object))
|
| + error (_("Got object file from memory but can't read symbols: %s."),
|
| + bfd_errmsg (bfd_get_error ()));
|
| +
|
| sai = alloc_section_addr_info (bfd_count_sections (nbfd));
|
| - cleanup = make_cleanup (xfree, sai);
|
| + make_cleanup (xfree, sai);
|
| i = 0;
|
| for (sec = nbfd->sections; sec != NULL; sec = sec->next)
|
| if ((bfd_get_section_flags (nbfd, sec) & (SEC_ALLOC|SEC_LOAD)) != 0)
|
| @@ -126,8 +127,10 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
|
| sai->other[i].sectindex = sec->index;
|
| ++i;
|
| }
|
| + 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. */
|
| @@ -218,7 +221,7 @@ add_vsyscall_page (struct target_ops *target, int from_tty)
|
| args.bfd = bfd;
|
| args.sysinfo_ehdr = sysinfo_ehdr;
|
| args.name = xstrprintf ("system-supplied DSO at %s",
|
| - paddress (target_gdbarch, sysinfo_ehdr));
|
| + paddress (target_gdbarch (), sysinfo_ehdr));
|
| /* Pass zero for FROM_TTY, because the action of loading the
|
| vsyscall DSO was not triggered by the user, even if the user
|
| typed "run" at the TTY. */
|
|
|