From a3aa38ee6cb3da7e2759d852e1d4afccd9ca9aa3 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 4 Jan 2002 17:02:30 +0000 Subject: [PATCH] * elf-eh-frame.c (_bfd_elf_write_section_eh_frame): Don't crash if CIE at .eh_frame start is removed due to no FDEs referencing it. --- bfd/ChangeLog | 5 +++++ bfd/elf-eh-frame.c | 19 ++++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 66f0da94957..4695b895c30 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2002-01-04 Jakub Jelinek + + * elf-eh-frame.c (_bfd_elf_write_section_eh_frame): Don't crash if + CIE at .eh_frame start is removed due to no FDEs referencing it. + 2002-01-04 Jason Thorpe * config.bfd (x86_64-*-netbsd*): New target. diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c index cc653f7c81e..56a59da410c 100644 --- a/bfd/elf-eh-frame.c +++ b/bfd/elf-eh-frame.c @@ -919,14 +919,23 @@ _bfd_elf_write_section_eh_frame (abfd, sec, ehdrsec, contents) { if (sec_info->entry[i].cie) { - cie_offset = sec_info->entry[i].new_offset; - cie_offset += (sec_info->entry[i].sec->output_section->vma - + sec_info->entry[i].sec->output_offset - - sec->output_section->vma - - sec->output_offset); + /* If CIE is removed due to no remaining FDEs referencing it + and there were no CIEs kept before it, sec_info->entry[i].sec + will be zero. */ + if (sec_info->entry[i].sec == NULL) + cie_offset = 0; + else + { + cie_offset = sec_info->entry[i].new_offset; + cie_offset += (sec_info->entry[i].sec->output_section->vma + + sec_info->entry[i].sec->output_offset + - sec->output_section->vma + - sec->output_offset); + } } continue; } + if (sec_info->entry[i].cie) { /* CIE */ -- 2.30.2