PowerPC VLE typo fix
[deliverable/binutils-gdb.git] / bfd / elf.c
index 5cfee9c58f77c3b70648e2979419367844b630b4..94726bad2e46782d1e6ce2168cea5d39c2882e63 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -1,6 +1,6 @@
 /* ELF executable support for BFD.
 
-   Copyright (C) 1993-2016 Free Software Foundation, Inc.
+   Copyright (C) 1993-2017 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
@@ -1346,6 +1346,16 @@ copy_special_section_fields (const bfd *ibfd,
      in the input bfd.  */
   if (iheader->sh_link != SHN_UNDEF)
     {
+      /* See PR 20931 for a reproducer.  */
+      if (iheader->sh_link >= elf_numsections (ibfd))
+       {
+         (* _bfd_error_handler)
+           /* xgettext:c-format */
+           (_("%B: Invalid sh_link field (%d) in section number %d"),
+            ibfd, iheader->sh_link, secnum);
+         return FALSE;
+       }
+
       sh_link = find_link (obfd, iheaders[iheader->sh_link], iheader->sh_link);
       if (sh_link != SHN_UNDEF)
        {
@@ -5115,6 +5125,7 @@ assign_file_positions_for_load_sections (bfd *abfd,
   Elf_Internal_Phdr *p;
   file_ptr off;
   bfd_size_type maxpagesize;
+  unsigned int pt_load_count = 0;
   unsigned int alloc;
   unsigned int i, j;
   bfd_vma header_pad = 0;
@@ -5242,6 +5253,7 @@ assign_file_positions_for_load_sections (bfd *abfd,
            maxpagesize = m->p_align;
 
          p->p_align = maxpagesize;
+         pt_load_count += 1;
        }
       else if (m->p_align_valid)
        p->p_align = m->p_align;
@@ -5293,6 +5305,15 @@ assign_file_positions_for_load_sections (bfd *abfd,
              }
 
          off_adjust = vma_page_aligned_bias (p->p_vaddr, off, align);
+
+         /* Broken hardware and/or kernel require that files do not
+            map the same page with different permissions on some hppa
+            processors.  */
+         if (pt_load_count > 1
+             && bed->no_page_alias
+             && (off & (maxpagesize - 1)) != 0
+             && (off & -maxpagesize) == ((off + off_adjust) & -maxpagesize))
+           off_adjust += maxpagesize;
          off += off_adjust;
          if (no_contents)
            {
This page took 0.026184 seconds and 4 git commands to generate.