[binutils-gdb] unusual eh_frame memory leak
Alan Modra
amodra@sourceware.org
Thu Jan 23 06:46:46 GMT 2025
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=40c7f80788e28f3dd638a3d0d7ff1554c73dbbc0
commit 40c7f80788e28f3dd638a3d0d7ff1554c73dbbc0
Author: Alan Modra <amodra@gmail.com>
Date: Wed Jan 22 07:49:56 2025 +1030
unusual eh_frame memory leak
This one happens with --gc-sections and a linker script that either
discards some or all .eh_frame sections (eg. ld-elf/pr14265 test) or
maps an input .eh_frame to some other named output section. In that
case the discarded/renamed .eh_frame won't have local_cies freed.
* elf-eh-frame.c (_bfd_elf_parse_eh_frame): Correct comment.
* elf.c (_bfd_elf_free_cached_info): Free eh_frame cies.
Diff:
---
bfd/elf-eh-frame.c | 4 +++-
bfd/elf.c | 6 ++++++
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c
index dd6802b05fd..08ffc5f1b4a 100644
--- a/bfd/elf-eh-frame.c
+++ b/bfd/elf-eh-frame.c
@@ -606,7 +606,9 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
|| (sec->flags & SEC_HAS_CONTENTS) == 0
|| sec->sec_info_type != SEC_INFO_TYPE_NONE)
{
- /* This file does not contain .eh_frame information. */
+ /* This file does not contain .eh_frame information or
+ .eh_frame has already been parsed, as can happen with
+ --gc-sections. */
return;
}
diff --git a/bfd/elf.c b/bfd/elf.c
index 4fa8a2a7911..0fa580d8d78 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -10134,6 +10134,12 @@ _bfd_elf_free_cached_info (bfd *abfd)
}
free (elf_section_data (sec)->relocs);
elf_section_data (sec)->relocs = NULL;
+ if (sec->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
+ {
+ struct eh_frame_sec_info *sec_info
+ = elf_section_data (sec)->sec_info;
+ free (sec_info->cies);
+ }
}
free (tdata->symtab_hdr.contents);
tdata->symtab_hdr.contents = NULL;
More information about the Binutils-cvs
mailing list