ld -r abort in _bfd_elf_write_section_eh_frame
authorAlan Modra <amodra@gmail.com>
Tue, 11 Nov 2014 09:43:03 +0000 (20:13 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 11 Nov 2014 10:07:00 +0000 (20:37 +1030)
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
bfd/elf-eh-frame.c

index 87a4080..c7aef87 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-11  Alan Modra  <amodra@gmail.com>
+
+       * elf-eh-frame.c (_bfd_elf_write_section_eh_frame): Adjust section
+       size check to account for possible zero terminator.
+
 2014-11-10  Matthew Fortune  <matthew.fortune@imgtec.com>
 
        Apply trunk patch:
index e481f34..002932d 100644 (file)
@@ -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.  */