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. */ |