mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2026-08-27 00:26:02 -04:00
Free bfds on the file_chain at linker exit.
This commit is contained in:
parent
2433c1cbac
commit
52fdc0531e
3 changed files with 36 additions and 6 deletions
31
ld/ldlang.c
31
ld/ldlang.c
|
|
@ -1427,6 +1427,37 @@ lang_finish (void)
|
|||
ldfile_free ();
|
||||
}
|
||||
|
||||
/* Called by ld_cleanup() at linker exit. Frees any remaining memory used by
|
||||
ldlang.c in order to pacify memory leak checkers. */
|
||||
|
||||
void
|
||||
lang_cleanup (void)
|
||||
{
|
||||
lang_input_statement_type *search;
|
||||
|
||||
/* FIXME: Walking the file_chain list closes most of the open bfds but not
|
||||
all of them. We should find and close the others as well.
|
||||
|
||||
Note: the bfds closed here can also be found on the input_file_chain and
|
||||
link_info.input_bfd lists. A bfd can only be closed once however, so we
|
||||
must not walk those other lists. */
|
||||
|
||||
for (search = (void *) file_chain.head;
|
||||
search != NULL;
|
||||
search = search->next_real_file)
|
||||
{
|
||||
if (search->the_bfd == NULL)
|
||||
continue;
|
||||
|
||||
bfd_close_all_done (search->the_bfd);
|
||||
search->the_bfd = NULL;
|
||||
}
|
||||
|
||||
stat_free (NULL);
|
||||
|
||||
obstack_free (&pt_obstack, NULL);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
A region is an area of memory declared with the
|
||||
MEMORY { name:org=exp, len=exp ... }
|
||||
|
|
|
|||
|
|
@ -546,6 +546,8 @@ extern void lang_init
|
|||
(bool);
|
||||
extern void lang_finish
|
||||
(void);
|
||||
extern void lang_cleanup
|
||||
(void);
|
||||
extern lang_memory_region_type * lang_memory_region_lookup
|
||||
(const char * const, bool);
|
||||
extern void lang_memory_region_alias
|
||||
|
|
|
|||
|
|
@ -222,14 +222,11 @@ write_dependency_file (void)
|
|||
static void
|
||||
ld_cleanup (void)
|
||||
{
|
||||
bfd *ibfd, *inext;
|
||||
if (link_info.output_bfd)
|
||||
bfd_close_all_done (link_info.output_bfd);
|
||||
for (ibfd = link_info.input_bfds; ibfd; ibfd = inext)
|
||||
{
|
||||
inext = ibfd->link.next;
|
||||
bfd_close_all_done (ibfd);
|
||||
}
|
||||
|
||||
lang_cleanup ();
|
||||
|
||||
/* Note - we do not call ld_plugin_start (PHASE_PLUGINS) here as this
|
||||
function is only called when the linker is exiting - ie after any
|
||||
stats may have been reported, and potentially in the middle of a
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue