2006-05-23 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 24 May 2006 02:37:47 +0000 (02:37 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 24 May 2006 02:37:47 +0000 (02:37 +0000)
PR ld/2655
PR ld/2657
* elf-eh-frame.c (_bfd_elf_write_section_eh_frame): Properly
update CIE/FDE length.  Don't pad to the section alignment.

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

index b6c2c771440a761b070b3c476d0efa901e44533c..dee6153032b0215055494d934ddb6423b67f8e3a 100644 (file)
@@ -1,3 +1,10 @@
+2006-05-23  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/2655
+       PR ld/2657
+       * elf-eh-frame.c (_bfd_elf_write_section_eh_frame): Properly
+       update CIE/FDE length.  Don't pad to the section alignment.
+
 2006-05-23  Jie Zhang  <jie.zhang@analog.com>
 
        * elf32-bfin.c (bfinfdpic_relocate_section): Clear reloc for
index 4f9ed4a99a9f12a1496e84038978a183fbde66a2..b430b8bb6081e5ce38db54dfb092d5952c44b882 100644 (file)
@@ -1075,12 +1075,12 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
       end = buf + ent->size;
       new_size = size_of_output_cie_fde (ent, ptr_size);
 
-      /* Install the new size, filling the extra bytes with DW_CFA_nops.  */
+      /* Update the size.  It may be shrinked.  */
+      bfd_put_32 (abfd, new_size - 4, buf);
+
+      /* Filling the extra bytes with DW_CFA_nops.  */
       if (new_size != ent->size)
-       {
-         memset (end, 0, new_size - ent->size);
-         bfd_put_32 (abfd, new_size - 4, buf);
-       }
+       memset (end, 0, new_size - ent->size);
 
       if (ent->cie)
        {
@@ -1262,40 +1262,13 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
        }
     }
 
-    {
-      unsigned int alignment = 1 << sec->alignment_power;
-      unsigned int pad = sec->size % alignment;
-
-      /* Don't pad beyond the raw size of the output section. It
-        can happen at the last input section.  */
-      if (pad
-         && ((sec->output_offset + sec->size + pad)
-             <= sec->output_section->size))
-       {
-         bfd_byte *buf;
-         unsigned int new_size;
-
-         /* Find the last CIE/FDE.  */
-         ent = sec_info->entry + sec_info->count;
-         while (--ent != sec_info->entry)
-           if (!ent->removed)
-             break;
-
-         /* The size of the last CIE/FDE must be at least 4.  */
-         if (ent->removed || ent->size < 4)
-           abort ();
-
-         pad = alignment - pad;
-         buf = contents + ent->new_offset - sec->output_offset;
-         new_size = size_of_output_cie_fde (ent, ptr_size);
-
-         /* Pad it with DW_CFA_nop  */
-         memset (buf + new_size, 0, pad);
-         bfd_put_32 (abfd, new_size + pad - 4, buf);
-
-         sec->size += pad;
-       }
-    }
+  /* We don't align the section to its section alignment since the
+     runtime library only expects all CIE/FDE records aligned at
+     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)
+    abort ();
 
   return bfd_set_section_contents (abfd, sec->output_section,
                                   contents, (file_ptr) sec->output_offset,
This page took 0.036904 seconds and 4 git commands to generate.