Produce output file with -noinhibit-exec after overlapping FDE error
authorAlan Modra <amodra@gmail.com>
Mon, 22 Sep 2014 08:19:17 +0000 (17:49 +0930)
committerAlan Modra <amodra@gmail.com>
Mon, 22 Sep 2014 09:20:13 +0000 (18:50 +0930)
* elf-eh-frame (_bfd_elf_write_section_eh_frame_hdr): Don't return
false for overflow or overlapping FDEs.  Give more detail in
error messages.

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

index b81755413023d216651aea0a45f21b0ddbd1dce1..2fc0e1e977652f782ee4f85e15818f56310a6bf0 100644 (file)
@@ -1,3 +1,9 @@
+2014-09-22  Alan Modra  <amodra@gmail.com>
+
+       * elf-eh-frame.c (_bfd_elf_write_section_eh_frame_hdr): Don't return
+       false for overflow or overlapping FDEs.  Give more detail in
+       error messages.
+
 2014-09-22  Andrew Bennett  <andrew.bennett@imgtec.com>
 
        * elfxx-mips.c (mips_elf_calculate_relocation): Don't sign extend
index 02f2d2322ae77b028f41500d31d838b5ddafd396..b32add34a36c1a6753d812fc1f625afbea0bb684 100644 (file)
@@ -1807,13 +1807,10 @@ _bfd_elf_write_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
       if (contents[2] != DW_EH_PE_omit)
        {
          unsigned int i;
-         bfd_boolean overlap, overflow;
 
          bfd_put_32 (abfd, hdr_info->fde_count, contents + EH_FRAME_HDR_SIZE);
          qsort (hdr_info->array, hdr_info->fde_count,
                 sizeof (*hdr_info->array), vma_compare);
-         overlap = FALSE;
-         overflow = FALSE;
          for (i = 0; i < hdr_info->fde_count; i++)
            {
              bfd_vma val;
@@ -1823,31 +1820,28 @@ _bfd_elf_write_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
              if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64
                  && (hdr_info->array[i].initial_loc
                      != sec->output_section->vma + val))
-               overflow = TRUE;
+               (*info->callbacks->einfo)
+                 (_("%X%P: .eh_frame_hdr table[%u] pc overflow.\n"), i);
              bfd_put_32 (abfd, val, contents + EH_FRAME_HDR_SIZE + i * 8 + 4);
+
              val = hdr_info->array[i].fde - sec->output_section->vma;
              val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
              if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64
                  && (hdr_info->array[i].fde
                      != sec->output_section->vma + val))
-               overflow = TRUE;
+               (*info->callbacks->einfo)
+                 (_("%X%P: .eh_frame_hdr table[%u] fde overflow.\n"), i);
              bfd_put_32 (abfd, val, contents + EH_FRAME_HDR_SIZE + i * 8 + 8);
+
              if (i != 0
                  && (hdr_info->array[i].initial_loc
                      < (hdr_info->array[i - 1].initial_loc
                         + hdr_info->array[i - 1].range)))
-               overlap = TRUE;
-           }
-         if (overflow)
-           (*info->callbacks->einfo)
-             (_("%P: .eh_frame_hdr entry overflow.\n"));
-         if (overlap)
-           (*info->callbacks->einfo)
-             (_("%P: .eh_frame_hdr refers to overlapping FDEs.\n"));
-         if (overflow || overlap)
-           {
-             bfd_set_error (bfd_error_bad_value);
-             retval = FALSE;
+               (*info->callbacks->einfo)
+                 (_("%X%P: .eh_frame_hdr table[%u] FDE at %V overlaps "
+                    "table[%u] FDE at %V.\n"),
+                  i - 1, hdr_info->array[i - 1].fde,
+                  i, hdr_info->array[i].fde);
            }
        }
 
This page took 0.027022 seconds and 4 git commands to generate.