* elf-eh-frame.c (_bfd_elf_discard_section_eh_frame): Don't build
authorJakub Jelinek <jakub@redhat.com>
Mon, 22 Apr 2002 21:37:48 +0000 (21:37 +0000)
committerJakub Jelinek <jakub@redhat.com>
Mon, 22 Apr 2002 21:37:48 +0000 (21:37 +0000)
search table if some FDE is DW_EH_PE_aligned encoded either.
(_bfd_elf_write_section_eh_frame): Handle terminating FDE specially.

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

index 78eec86852ba75a84fdd6272b5d899b3570276d4..bc5543a26e144e1eda8096879ac67847782bb002 100644 (file)
@@ -1,3 +1,9 @@
+2002-04-22  Jakub Jelinek  <jakub@redhat.com>
+
+       * elf-eh-frame.c (_bfd_elf_discard_section_eh_frame): Don't build
+       search table if some FDE is DW_EH_PE_aligned encoded either.
+       (_bfd_elf_write_section_eh_frame): Handle terminating FDE specially.
+
 2002-04-22  Richard Smith  <richard@ex-parrot.com>
            Jakub Jelinek  <jakub@redhat.com>
 
index 83ccfe9c54ec67550135f68ef76d993854364dcb..6a23edb2c42515a67d9de8479937b8b4a63e3edb 100644 (file)
@@ -636,8 +636,9 @@ _bfd_elf_discard_section_eh_frame (abfd, info, sec, ehdrsec,
          else
            {
              if (info->shared
-                 && (cie.fde_encoding & 0xf0) == DW_EH_PE_absptr
-                 && cie.make_relative == 0)
+                 && (((cie.fde_encoding & 0xf0) == DW_EH_PE_absptr
+                      && cie.make_relative == 0)
+                     || (cie.fde_encoding & 0xf0) == DW_EH_PE_aligned))
                {
                  /* If shared library uses absolute pointers
                     which we cannot turn into PC relative,
@@ -1026,7 +1027,7 @@ _bfd_elf_write_section_eh_frame (abfd, sec, ehdrsec, contents)
                  }
            }
        }
-      else
+      else if (sec_info->entry[i].size > 4)
        {
          /* FDE */
          bfd_vma value = 0, address;
@@ -1099,6 +1100,9 @@ _bfd_elf_write_section_eh_frame (abfd, sec, ehdrsec, contents)
                }
            }
        }
+      else
+       /* Terminating FDE must be at the end of .eh_frame section only.  */
+       BFD_ASSERT (i == sec_info->count - 1);
 
       BFD_ASSERT (p == contents + sec_info->entry[i].new_offset);
       memmove (p, contents + sec_info->entry[i].offset,