From 4de1599bcf044a5396ec588f90b8f475be657d4f Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 11 Nov 2014 20:13:03 +1030 Subject: [PATCH] ld -r abort in _bfd_elf_write_section_eh_frame Turning on .eh_frame processing for ld -r resulted in systemtap tickling a ld bug. Triggered by the zero terminator not being added to .eh_frame in a separate file as it usually is (crtend.o), but instead being present in the last .eh_frame section along with CIEs and FDEs. The 4-byte terminator makes the section size check fail on 64-bit targets. * elf-eh-frame (_bfd_elf_write_section_eh_frame): Adjust section size check to account for possible zero terminator. --- bfd/ChangeLog | 5 +++++ bfd/elf-eh-frame.c | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 7f14166acd..72b6ceb4ea 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2014-11-11 Alan Modra + + * elf-eh-frame.c (_bfd_elf_write_section_eh_frame): Adjust section + size check to account for possible zero terminator. + 2014-11-10 James Cowgill * elfxx-mips.c (_bfd_mips_elf_section_processing): don't force small diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c index e481f349dd..002932d1bf 100644 --- a/bfd/elf-eh-frame.c +++ b/bfd/elf-eh-frame.c @@ -1398,6 +1398,7 @@ _bfd_elf_write_section_eh_frame (bfd *abfd, struct eh_frame_hdr_info *hdr_info; unsigned int ptr_size; struct eh_cie_fde *ent; + bfd_size_type sec_size; if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME) /* FIXME: octets_per_byte. */ @@ -1723,7 +1724,11 @@ _bfd_elf_write_section_eh_frame (bfd *abfd, the pointer size. _bfd_elf_discard_section_eh_frame should have padded CIE/FDE records to multiple of pointer size with size_of_output_cie_fde. */ - if ((sec->size % ptr_size) != 0) + sec_size = sec->size; + if (sec_info->count != 0 + && sec_info->entry[sec_info->count - 1].size == 4) + sec_size -= 4; + if ((sec_size % ptr_size) != 0) abort (); /* FIXME: octets_per_byte. */ -- 2.34.1