]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
unusual eh_frame memory leak
authorAlan Modra <amodra@gmail.com>
Tue, 21 Jan 2025 21:19:56 +0000 (07:49 +1030)
committerAlan Modra <amodra@gmail.com>
Thu, 23 Jan 2025 01:10:40 +0000 (11:40 +1030)
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.

bfd/elf-eh-frame.c
bfd/elf.c

index dd6802b05fd3009842ddbac7a83174128a42ee36..08ffc5f1b4a113366db1657ca94a2709cef9a58f 100644 (file)
@@ -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;
     }
 
index 4fa8a2a7911eb0f7c31d06109a6fca5687a88516..0fa580d8d78421b31bc2d2a79dac42b776fbefb2 100644 (file)
--- 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;