From: Alan Modra Date: Tue, 21 Jan 2025 21:19:56 +0000 (+1030) Subject: unusual eh_frame memory leak X-Git-Tag: binutils-2_45~1865 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=40c7f80788e28f3dd638a3d0d7ff1554c73dbbc0;p=thirdparty%2Fbinutils-gdb.git 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 --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;