2003-10-06 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 6 Oct 2003 18:10:48 +0000 (18:10 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 6 Oct 2003 18:10:48 +0000 (18:10 +0000)
* elf-eh-frame.c (_bfd_elf_write_section_eh_frame): Pad the
last CIE/FDE if needed.

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

index 77e9f8701749d43ca88b98e3e42fa66049f462a1..45bb8e03341e121dd123d557edcfaf5747fa5b6a 100644 (file)
@@ -1,3 +1,8 @@
+2003-10-06  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elf-eh-frame.c (_bfd_elf_write_section_eh_frame): Pad the
+       last CIE/FDE if needed.
+
 2003-10-06  Matt Thomas <matt@3am-software.com>
 
          config.bfd: Move the hppa*-*-netbsd* case to the hppa*-*-linux* case.
index c71129e694fbd17195935c2b2611f65a049abe22..c2f6b961a13d5d5d2955cbb4ec56230ed2cb0c66 100644 (file)
@@ -1026,6 +1026,38 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
                                           and 3xDW_CFA_nop as pad  */
       p += 16;
     }
+  else
+    {
+      unsigned int alignment = 1 << sec->alignment_power;
+      unsigned int pad = sec->_cooked_size % alignment;
+
+      if (pad)
+       {
+         /* Find the last CIE/FDE.  */
+         for (i = sec_info->count - 1; i > 0; i--)
+           if (! sec_info->entry[i].removed)
+             break;
+
+         /* The size of the last CIE/FDE must be at least 4.  */
+         if (sec_info->entry[i].removed
+             || sec_info->entry[i].size < 4)
+           abort ();
+
+         pad = alignment - pad;
+
+         buf = contents + sec_info->entry[i].new_offset;
+
+         /* Update length.  */
+         sec_info->entry[i].size += pad;
+         bfd_put_32 (abfd, sec_info->entry[i].size - 4, buf);
+
+         /* Pad it with DW_CFA_nop  */
+         memset (p, 0, pad);
+         p += pad;
+
+         sec->_cooked_size += pad;
+       }
+    }
 
   BFD_ASSERT ((bfd_size_type) (p - contents) == sec->_cooked_size);