2003-10-16 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 16 Oct 2003 21:04:04 +0000 (21:04 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 16 Oct 2003 21:04:04 +0000 (21:04 +0000)
* elf-eh-frame.c (_bfd_elf_discard_section_eh_frame): Don't
use the last CIE from a different section.
(_bfd_elf_write_section_eh_frame): Don't pad beyond the raw
size of the output section.

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

index b96d322e892900cb7d6791748be28742ea9a4f2f..337c7c8c7a5ae39f58f36ae87cecae6586beccdb 100644 (file)
@@ -1,3 +1,10 @@
+2003-10-16  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elf-eh-frame.c (_bfd_elf_discard_section_eh_frame): Don't
+       use the last CIE from a different section.
+       (_bfd_elf_write_section_eh_frame): Don't pad beyond the raw
+       size of the output section.
+
 2003-10-07  Roland McGrath  <roland@redhat.com>
 
        * elf.c (_bfd_elf_make_section_from_phdr): Set alignment_power of
index c2f6b961a13d5d5d2955cbb4ec56230ed2cb0c66..28e0b55fefdf3cc73b2e143ed816ec48bcfcd0b6 100644 (file)
@@ -372,6 +372,9 @@ _bfd_elf_discard_section_eh_frame
                 all FDEs.  Also, it can be removed if we have removed
                 all FDEs using it.  */
              if ((!info->relocatable
+                  && hdr_info->last_cie_sec
+                  && (sec->output_section
+                      == hdr_info->last_cie_sec->output_section)
                   && cie_compare (&cie, &hdr_info->last_cie) == 0)
                  || cie_usage_count == 0)
                {
@@ -1031,7 +1034,11 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
       unsigned int alignment = 1 << sec->alignment_power;
       unsigned int pad = sec->_cooked_size % alignment;
 
-      if (pad)
+      /* 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->_cooked_size + pad)
+             <= sec->output_section->_raw_size))
        {
          /* Find the last CIE/FDE.  */
          for (i = sec_info->count - 1; i > 0; i--)