This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: Memory leaks in libbfd, trace provided
- From: Alan Modra <amodra at gmail dot com>
- To: Alexis Naveros <alexis at rayforce dot net>
- Cc: binutils at sourceware dot org, bug-binutils at gnu dot org
- Date: Wed, 1 Aug 2012 10:58:07 +0930
- Subject: Re: Memory leaks in libbfd, trace provided
- References: <56136.190.207.139.30.1343654535.squirrel@mail.glvortex.net>
On Mon, Jul 30, 2012 at 09:22:15AM -0400, Alexis Naveros wrote:
> I have some code which is using libbfd (binutils 2.22) abundantly, and I
> couldn't help but notice memory usage grow to a couple GB after a while.
> I'm of course calling bfd_close() for every bfd opened, but some memory
> allocated from within libbfd.so is never freed.
Thanks for the report. I'm applying the following to mainline
binutils. The patch will need to be applied by hand to binutils-2.22.
* dwarf2.c (struct dwarf2_debug): Add close_on_cleanup.
(_bfd_dwarf2_slurp_debug_info): Set close_on_cleanup if we open
gnu_debuglink bfd.
(_bfd_dwarf2_cleanup_debug_info): Act on close_on_cleanup.
Index: bfd/dwarf2.c
===================================================================
RCS file: /cvs/src/src/bfd/dwarf2.c,v
retrieving revision 1.150
diff -u -p -r1.150 dwarf2.c
--- bfd/dwarf2.c 26 Jul 2012 18:20:39 -0000 1.150
+++ bfd/dwarf2.c 1 Aug 2012 01:24:18 -0000
@@ -173,6 +173,9 @@ struct dwarf2_debug
#define STASH_INFO_HASH_OFF 0
#define STASH_INFO_HASH_ON 1
#define STASH_INFO_HASH_DISABLED 2
+
+ /* True if we opened bfd_ptr. */
+ bfd_boolean close_on_cleanup;
};
struct arange
@@ -3206,6 +3209,7 @@ _bfd_dwarf2_slurp_debug_info (bfd *abfd,
if (! stash)
return FALSE;
stash->debug_sections = debug_sections;
+ stash->syms = symbols;
*pinfo = stash;
@@ -3235,7 +3239,9 @@ _bfd_dwarf2_slurp_debug_info (bfd *abfd,
free (debug_filename);
return FALSE;
}
+ stash->close_on_cleanup = TRUE;
}
+ stash->bfd_ptr = debug_bfd;
/* There can be more than one DWARF2 info section in a BFD these
days. First handle the easy case when there's only one. If
@@ -3293,9 +3299,6 @@ _bfd_dwarf2_slurp_debug_info (bfd *abfd,
stash->info_ptr_end = stash->info_ptr + total_size;
stash->sec = find_debug_info (debug_bfd, debug_sections, NULL);
stash->sec_info_ptr = stash->info_ptr;
- stash->syms = symbols;
- stash->bfd_ptr = debug_bfd;
-
return TRUE;
}
@@ -3689,4 +3692,6 @@ _bfd_dwarf2_cleanup_debug_info (bfd *abf
free (stash->dwarf_ranges_buffer);
if (stash->info_ptr_memory)
free (stash->info_ptr_memory);
+ if (stash->close_on_cleanup)
+ bfd_close (stash->bfd_ptr);
}
--
Alan Modra
Australia Development Lab, IBM