public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* Re: Memory leaks in libbfd, trace provided
       [not found] <56136.190.207.139.30.1343654535.squirrel@mail.glvortex.net>
@ 2012-08-01  1:28 ` Alan Modra
  0 siblings, 0 replies; only message in thread
From: Alan Modra @ 2012-08-01  1:28 UTC (permalink / raw)
  To: Alexis Naveros; +Cc: binutils, bug-binutils

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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2012-08-01  1:28 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <56136.190.207.139.30.1343654535.squirrel@mail.glvortex.net>
2012-08-01  1:28 ` Memory leaks in libbfd, trace provided Alan Modra

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).