diff options
author | Tom Tromey <tromey@redhat.com> | 2012-07-23 18:54:26 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2012-07-23 18:54:26 +0000 |
commit | da1cc82f30edcf2d49dd89911fc471a5e07d3d94 (patch) | |
tree | ce59f0809b5855b933aa977cad83177573e01bec /gdb/rs6000-nat.c | |
parent | 6c18f3e0f4d7e0399b39a0d554b5152af71a94e2 (diff) | |
download | gdb-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.c | 18 |
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; } |