aboutsummaryrefslogtreecommitdiff
path: root/gdb/rs6000-nat.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2012-07-23 18:54:26 +0000
committerTom Tromey <tromey@redhat.com>2012-07-23 18:54:26 +0000
commitda1cc82f30edcf2d49dd89911fc471a5e07d3d94 (patch)
treece59f0809b5855b933aa977cad83177573e01bec /gdb/rs6000-nat.c
parent6c18f3e0f4d7e0399b39a0d554b5152af71a94e2 (diff)
downloadgdb-da1cc82f30edcf2d49dd89911fc471a5e07d3d94.zip
gdb-da1cc82f30edcf2d49dd89911fc471a5e07d3d94.tar.gz
gdb-da1cc82f30edcf2d49dd89911fc471a5e07d3d94.tar.bz2
* rs6000-nat.c (add_vmap): Rewrite archive loop. Fix reference
counting. * exec.c (exec_close_1): Unconditionally release vmap's BFD. (map_vmap): Acquire a reference to the BFD.
Diffstat (limited to 'gdb/rs6000-nat.c')
-rw-r--r--gdb/rs6000-nat.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/gdb/rs6000-nat.c b/gdb/rs6000-nat.c
index 8c3f546..9b8efd3 100644
--- a/gdb/rs6000-nat.c
+++ b/gdb/rs6000-nat.c
@@ -765,12 +765,16 @@ add_vmap (LdInfo *ldi)
else if (bfd_check_format (abfd, bfd_archive))
{
- last = 0;
- /* FIXME??? am I tossing BFDs? bfd? */
- while ((last = gdb_bfd_openr_next_archived_file (abfd, last)))
+ last = gdb_bfd_openr_next_archived_file (abfd, NULL);
+ while (last != NULL)
{
+ bfd *next;
+
if (strcmp (mem, last->filename) == 0)
break;
+
+ next = gdb_bfd_openr_next_archived_file (abfd, last);
+ gdb_bfd_unref (last);
}
if (!last)
@@ -790,6 +794,9 @@ add_vmap (LdInfo *ldi)
}
vp = map_vmap (last, abfd);
+ /* map_vmap acquired a reference to LAST, so we can release
+ ours. */
+ gdb_bfd_unref (last);
}
else
{
@@ -804,6 +811,11 @@ add_vmap (LdInfo *ldi)
/* Always add symbols for the main objfile. */
if (vp == vmap || auto_solib_add)
vmap_add_symbols (vp);
+
+ /* Anything needing a reference to ABFD has already acquired it, so
+ release our local reference. */
+ gdb_bfd_unref (abfd);
+
return vp;
}