Automatic date update in version.in
[deliverable/binutils-gdb.git] / bfd / elf.c
index a85498d2ced69ec128658c00c28fed719de4b751..9418e51a7e0e30f09fc5a0798175125ec5a1b69c 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.
 
@@ -338,6 +338,7 @@ bfd_elf_string_from_elf_section (bfd *abfd,
       if (hdr->sh_type != SHT_STRTAB && hdr->sh_type < SHT_LOOS)
        {
          /* PR 17512: file: f057ec89.  */
+         /* xgettext:c-format */
          _bfd_error_handler (_("%B: attempt to load strings from a non-string section (number %d)"),
                              abfd, shindex);
          return NULL;
@@ -351,6 +352,7 @@ bfd_elf_string_from_elf_section (bfd *abfd,
     {
       unsigned int shstrndx = elf_elfheader(abfd)->e_shstrndx;
       _bfd_error_handler
+       /* xgettext:c-format */
        (_("%B: invalid string offset %u >= %lu for section `%s'"),
         abfd, strindex, (unsigned long) hdr->sh_size,
         (shindex == shstrndx && strindex == hdr->sh_name
@@ -489,6 +491,7 @@ bfd_elf_get_elf_syms (bfd *ibfd,
     if (!(*bed->s->swap_symbol_in) (ibfd, esym, shndx, isym))
       {
        symoffset += (esym - (bfd_byte *) extsym_buf) / extsym_size;
+       /* xgettext:c-format */
        _bfd_error_handler (_("%B symbol number %lu references "
                              "nonexistent SHT_SYMTAB_SHNDX section"),
                            ibfd, (unsigned long) symoffset);
@@ -645,6 +648,7 @@ setup_group (bfd *abfd, Elf_Internal_Shdr *hdr, asection *newsect)
                  if (shdr->contents == NULL)
                    {
                      _bfd_error_handler
+                       /* xgettext:c-format */
                        (_("%B: corrupt size field in group section header: 0x%lx"), abfd, shdr->sh_size);
                      bfd_set_error (bfd_error_bad_value);
                      -- num_group;
@@ -658,6 +662,7 @@ setup_group (bfd *abfd, Elf_Internal_Shdr *hdr, asection *newsect)
                          != shdr->sh_size))
                    {
                      _bfd_error_handler
+                       /* xgettext:c-format */
                        (_("%B: invalid size field in group section header: 0x%lx"), abfd, shdr->sh_size);
                      bfd_set_error (bfd_error_bad_value);
                      -- num_group;
@@ -778,6 +783,7 @@ setup_group (bfd *abfd, Elf_Internal_Shdr *hdr, asection *newsect)
 
   if (elf_group_name (newsect) == NULL)
     {
+      /* xgettext:c-format */
       _bfd_error_handler (_("%B: no group info for section %A"),
                          abfd, newsect);
       return FALSE;
@@ -808,6 +814,7 @@ _bfd_elf_setup_sections (bfd *abfd)
              const struct elf_backend_data *bed = get_elf_backend_data (abfd);
              if (bed->link_order_error_handler)
                bed->link_order_error_handler
+                 /* xgettext:c-format */
                  (_("%B: warning: sh_link not set for section `%A'"),
                   abfd, s);
            }
@@ -827,6 +834,7 @@ _bfd_elf_setup_sections (bfd *abfd)
              if (linksec == NULL)
                {
                  _bfd_error_handler
+                   /* xgettext:c-format */
                    (_("%B: sh_link [%d] in section `%A' is incorrect"),
                     s->owner, s, elfsec);
                  result = FALSE;
@@ -839,6 +847,7 @@ _bfd_elf_setup_sections (bfd *abfd)
               && elf_next_in_group (s) == NULL)
        {
          _bfd_error_handler
+           /* xgettext:c-format */
            (_("%B: SHT_GROUP section [index %d] has no SHF_GROUP sections"),
             abfd, elf_section_data (s)->this_idx);
          result = FALSE;
@@ -859,6 +868,7 @@ _bfd_elf_setup_sections (bfd *abfd)
       if (shdr == NULL || shdr->bfd_section == NULL || shdr->contents == NULL)
        {
          _bfd_error_handler
+           /* xgettext:c-format */
            (_("%B: section group entry number %u is corrupt"),
             abfd, i);
          result = FALSE;
@@ -883,6 +893,7 @@ _bfd_elf_setup_sections (bfd *abfd)
          {
            /* There are some unknown sections in the group.  */
            _bfd_error_handler
+             /* xgettext:c-format */
              (_("%B: unknown [%d] section `%s' in group [%s]"),
               abfd,
               (unsigned int) idx->shdr->sh_type,
@@ -1051,7 +1062,7 @@ _bfd_elf_make_section_from_shdr (bfd *abfd,
       if (!bfd_malloc_and_get_section (abfd, newsect, &contents))
        return FALSE;
 
-      elf_parse_notes (abfd, (char *) contents, hdr->sh_size, -1);
+      elf_parse_notes (abfd, (char *) contents, hdr->sh_size, hdr->sh_offset);
       free (contents);
     }
 
@@ -1149,6 +1160,7 @@ _bfd_elf_make_section_from_shdr (bfd *abfd,
          if (!bfd_init_section_compress_status (abfd, newsect))
            {
              _bfd_error_handler
+               /* xgettext:c-format */
                (_("%B: unable to initialize compress status for section %s"),
                 abfd, name);
              return FALSE;
@@ -1159,6 +1171,7 @@ _bfd_elf_make_section_from_shdr (bfd *abfd,
          if (!bfd_init_section_decompress_status (abfd, newsect))
            {
              _bfd_error_handler
+               /* xgettext:c-format */
                (_("%B: unable to initialize decompress status for section %s"),
                 abfd, name);
              return FALSE;
@@ -1258,13 +1271,19 @@ find_link (const bfd * obfd, const Elf_Internal_Shdr * iheader, const unsigned i
   Elf_Internal_Shdr ** oheaders = elf_elfsections (obfd);
   unsigned int i;
 
-  if (section_match (oheaders[hint], iheader))
+  BFD_ASSERT (iheader != NULL);
+
+  /* See PR 20922 for a reproducer of the NULL test.  */
+  if (oheaders[hint] != NULL
+      && section_match (oheaders[hint], iheader))
     return hint;
 
   for (i = 1; i < elf_numsections (obfd); i++)
     {
       Elf_Internal_Shdr * oheader = oheaders[i];
 
+      if (oheader == NULL)
+       continue;
       if (section_match (oheader, iheader))
        /* FIXME: Do we care if there is a potential for
           multiple matches ?  */
@@ -1327,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)
        {
@@ -1337,6 +1366,7 @@ copy_special_section_fields (const bfd *ibfd,
        /* FIXME: Should we install iheader->sh_link
           if we could not find a match ?  */
        (* _bfd_error_handler)
+         /* xgettext:c-format */
          (_("%B: Failed to find link section for section %d"), obfd, secnum);
     }
 
@@ -1363,6 +1393,7 @@ copy_special_section_fields (const bfd *ibfd,
        }
       else
        (* _bfd_error_handler)
+         /* xgettext:c-format */
          (_("%B: Failed to find info section for section %d"), obfd, secnum);
     }
 
@@ -2053,6 +2084,7 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
       if (elf_onesymtab (abfd) != 0)
        {
          _bfd_error_handler
+           /* xgettext:c-format */
            (_("%B: warning: multiple symbol tables detected - ignoring the table in section %u"),
             abfd, shindex);
          goto success;
@@ -2135,6 +2167,7 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
       if (elf_dynsymtab (abfd) != 0)
        {
          _bfd_error_handler
+           /* xgettext:c-format */
            (_("%B: warning: multiple dynamic symbol tables detected - ignoring the table in section %u"),
             abfd, shindex);
          goto success;
@@ -2246,6 +2279,7 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
        if (hdr->sh_link >= num_sec)
          {
            _bfd_error_handler
+             /* xgettext:c-format */
              (_("%B: invalid link %lu for reloc section %s (index %u)"),
               abfd, hdr->sh_link, name, shindex);
            ret = _bfd_elf_make_section_from_shdr (abfd, hdr, name,
@@ -2431,6 +2465,7 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
            /* FIXME: How to properly handle allocated section reserved
               for applications?  */
            _bfd_error_handler
+             /* xgettext:c-format */
              (_("%B: don't know how to handle allocated, application "
                 "specific section `%s' [0x%8x]"),
               abfd, name, hdr->sh_type);
@@ -2446,6 +2481,7 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
               && hdr->sh_type <= SHT_HIPROC)
        /* FIXME: We should handle this section.  */
        _bfd_error_handler
+         /* xgettext:c-format */
          (_("%B: don't know how to handle processor specific section "
             "`%s' [0x%8x]"),
           abfd, name, hdr->sh_type);
@@ -2457,6 +2493,7 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
               required to correctly process the section and the file should
               be rejected with an error message.  */
            _bfd_error_handler
+             /* xgettext:c-format */
              (_("%B: don't know how to handle OS specific section "
                 "`%s' [0x%8x]"),
               abfd, name, hdr->sh_type);
@@ -2470,6 +2507,7 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
       else
        /* FIXME: We should handle this section.  */
        _bfd_error_handler
+         /* xgettext:c-format */
          (_("%B: don't know how to handle section `%s' [0x%8x]"),
           abfd, name, hdr->sh_type);
 
@@ -3173,6 +3211,7 @@ elf_fake_sections (bfd *abfd, asection *asect, void *fsarg)
   if (asect->alignment_power >= (sizeof (bfd_vma) * 8) - 1)
     {
       _bfd_error_handler
+       /* xgettext:c-format */
        (_("%B: error: Alignment power %d of section `%A' is too big"),
         abfd, asect, asect->alignment_power);
       arg->failed = TRUE;
@@ -3644,6 +3683,7 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
 
   if (section_number >= SHN_LORESERVE)
     {
+      /* xgettext:c-format */
       _bfd_error_handler (_("%B: too many sections: %u"),
                          abfd, section_number);
       return FALSE;
@@ -3728,6 +3768,7 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
                    {
                      asection *kept;
                      _bfd_error_handler
+                       /* xgettext:c-format */
                        (_("%B: sh_link of section `%A' points to discarded section `%A' of `%B'"),
                         abfd, d->this_hdr.bfd_section,
                         s, s->owner);
@@ -3751,6 +3792,7 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
                  if (s->output_section == NULL)
                    {
                      _bfd_error_handler
+                       /* xgettext:c-format */
                        (_("%B: sh_link of section `%A' points to removed section `%A' of `%B'"),
                         abfd, d->this_hdr.bfd_section, s, s->owner);
                      bfd_set_error (bfd_error_bad_value);
@@ -3771,6 +3813,7 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
                = get_elf_backend_data (abfd);
              if (bed->link_order_error_handler)
                bed->link_order_error_handler
+                 /* xgettext:c-format */
                  (_("%B: warning: sh_link not set for section `%A'"),
                   abfd, sec);
            }
@@ -4411,7 +4454,10 @@ elf_modify_segment_map (bfd *abfd,
        }
       (*m)->count = new_count;
 
-      if (remove_empty_load && (*m)->p_type == PT_LOAD && (*m)->count == 0)
+      if (remove_empty_load
+         && (*m)->p_type == PT_LOAD
+         && (*m)->count == 0
+         && !(*m)->includes_phdrs)
        *m = (*m)->next;
       else
        m = &(*m)->next;
@@ -4461,6 +4507,7 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
       asection *dynsec, *eh_frame_hdr;
       bfd_size_type amt;
       bfd_vma addr_mask, wrap_to = 0;
+      bfd_boolean linker_created_pt_phdr_segment = FALSE;
 
       /* Select the allocated sections, and sort them.  */
 
@@ -4513,7 +4560,7 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
          m->p_flags = PF_R | PF_X;
          m->p_flags_valid = 1;
          m->includes_phdrs = 1;
-
+         linker_created_pt_phdr_segment = TRUE;
          *pm = m;
          pm = &m->next;
 
@@ -4564,7 +4611,19 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
              || ((sections[0]->lma & addr_mask) % maxpagesize
                  < phdr_size % maxpagesize)
              || (sections[0]->lma & addr_mask & -maxpagesize) < wrap_to)
-           phdr_in_segment = FALSE;
+           {
+             /* PR 20815: The ELF standard says that a PT_PHDR segment, if
+                present, must be included as part of the memory image of the
+                program.  Ie it must be part of a PT_LOAD segment as well.
+                If we have had to create our own PT_PHDR segment, but it is
+                not going to be covered by the first PT_LOAD segment, then
+                force the inclusion if we can...  */
+             if ((abfd->flags & D_PAGED) != 0
+                 && linker_created_pt_phdr_segment)
+               phdr_in_segment = TRUE;
+             else
+               phdr_in_segment = FALSE;
+           }
        }
 
       for (i = 0, hdrpp = sections; i < count; i++, hdrpp++)
@@ -5066,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;
@@ -5193,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;
@@ -5244,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)
            {
@@ -5379,6 +5449,7 @@ assign_file_positions_for_load_sections (bfd *abfd,
                      || p_end < p_start))
                {
                  _bfd_error_handler
+                   /* xgettext:c-format */
                    (_("%B: section %A lma %#lx adjusted to %#lx"), abfd, sec,
                     (unsigned long) s_start, (unsigned long) p_end);
                  adjust = 0;
@@ -5515,6 +5586,7 @@ assign_file_positions_for_load_sections (bfd *abfd,
                  && !ELF_TBSS_SPECIAL (this_hdr, p))
                {
                  _bfd_error_handler
+                   /* xgettext:c-format */
                    (_("%B: section `%A' can't be allocated in segment %d"),
                     abfd, sec, j);
                  print_segment_map (m);
@@ -5562,6 +5634,7 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
        {
          if (hdr->sh_size != 0)
            _bfd_error_handler
+             /* xgettext:c-format */
              (_("%B: warning: allocated section `%s' not in segment"),
               abfd,
               (hdr->bfd_section == NULL
@@ -5743,16 +5816,25 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
       else if (m->count != 0)
        {
          unsigned int i;
+
          if (p->p_type != PT_LOAD
              && (p->p_type != PT_NOTE
                  || bfd_get_format (abfd) != bfd_core))
            {
+             /* A user specified segment layout may include a PHDR
+                segment that overlaps with a LOAD segment...  */
+             if (p->p_type == PT_PHDR)
+               {
+                 m->count = 0;
+                 continue;
+               }
+
              if (m->includes_filehdr || m->includes_phdrs)
                {
                  /* PR 17512: file: 2195325e.  */
                  _bfd_error_handler
-                   (_("%B: warning: non-load segment includes file header and/or program header"),
-                    abfd);
+                   (_("%B: error: non-load segment %d includes file header and/or program header"),
+                    abfd, (int)(p - phdrs));
                  return FALSE;
                }
 
@@ -5900,6 +5982,39 @@ assign_file_positions_except_relocs (bfd *abfd,
 
       /* Write out the program headers.  */
       alloc = elf_program_header_size (abfd) / bed->s->sizeof_phdr;
+
+      /* Sort the program headers into the ordering required by the ELF standard.  */
+      if (alloc == 0)
+       return TRUE;
+
+      /* PR ld/20815 - Check that the program header segment, if present, will
+        be loaded into memory.  FIXME: The check below is not sufficient as
+        really all PT_LOAD segments should be checked before issuing an error
+        message.  Plus the PHDR segment does not have to be the first segment
+        in the program header table.  But this version of the check should
+        catch all real world use cases.
+
+        FIXME: We used to have code here to sort the PT_LOAD segments into
+        ascending order, as per the ELF spec.  But this breaks some programs,
+        including the Linux kernel.  But really either the spec should be
+         changed or the programs updated.  */
+      if (alloc > 1
+         && tdata->phdr[0].p_type == PT_PHDR
+         && ! bed->elf_backend_allow_non_load_phdr (abfd, tdata->phdr, alloc)
+         && tdata->phdr[1].p_type == PT_LOAD
+         && (tdata->phdr[1].p_vaddr > tdata->phdr[0].p_vaddr
+             || (tdata->phdr[1].p_vaddr + tdata->phdr[1].p_memsz)
+             <  (tdata->phdr[0].p_vaddr + tdata->phdr[0].p_memsz)))
+       {
+         /* The fix for this error is usually to edit the linker script being
+            used and set up the program headers manually.  Either that or
+            leave room for the headers at the start of the SECTIONS.  */
+         _bfd_error_handler (_("\
+%B: error: PHDR segment not covered by LOAD segment"),
+                             abfd);
+         return FALSE;
+       }
+
       if (bfd_seek (abfd, (bfd_signed_vma) bed->s->sizeof_ehdr, SEEK_SET) != 0
          || bed->s->write_out_phdrs (abfd, tdata->phdr, alloc) != 0)
        return FALSE;
@@ -6237,6 +6352,7 @@ _bfd_elf_symbol_from_bfd_symbol (bfd *abfd, asymbol **asym_ptr_ptr)
       /* This case can occur when using --strip-symbol on a symbol
         which is used in a relocation entry.  */
       _bfd_error_handler
+       /* xgettext:c-format */
        (_("%B: symbol `%s' required but not present"),
         abfd, bfd_asymbol_name (asym_ptr));
       bfd_set_error (bfd_error_no_symbols);
@@ -6573,11 +6689,16 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
          /* Special segments, such as the PT_PHDR segment, may contain
             no sections, but ordinary, loadable segments should contain
             something.  They are allowed by the ELF spec however, so only
-            a warning is produced.  */
-         if (segment->p_type == PT_LOAD)
+            a warning is produced.  
+            There is however the valid use case of embedded systems which
+            have segments with p_filesz of 0 and a p_memsz > 0 to initialize
+            flash memory with zeros.  No warning is shown for that case.  */
+         if (segment->p_type == PT_LOAD
+             && (segment->p_filesz > 0 || segment->p_memsz == 0))
+           /* xgettext:c-format */
            _bfd_error_handler (_("\
-%B: warning: Empty loadable segment detected, is this intentional ?"),
-                               ibfd);
+%B: warning: Empty loadable segment detected at vaddr=0x%.8x, is this intentional ?"),
+                               ibfd, segment->p_vaddr);
 
          map->count = 0;
          *pointer_to_map = map;
@@ -7188,6 +7309,7 @@ rewrite:
          {
            /* PR 17512: file: f17299af.  */
            if (segment->p_align > (bfd_vma) 1 << ((sizeof (bfd_vma) * 8) - 2))
+             /* xgettext:c-format */
              _bfd_error_handler (_("\
 %B: warning: segment alignment of 0x%llx is too large"),
                                  ibfd, (long long) segment->p_align);
@@ -7664,6 +7786,7 @@ error_return:
                    shndx = _bfd_elf_section_from_bfd_section (abfd, sec2);
                  if (shndx == SHN_BAD)
                    {
+                     /* xgettext:c-format */
                      _bfd_error_handler (_("\
 Unable to find equivalent output section for symbol '%s' from section '%s'"),
                                          syms[idx]->name ? syms[idx]->name : "<Local sym>",
@@ -8674,6 +8797,7 @@ _bfd_elf_validate_reloc (bfd *abfd, arelent *areloc)
 
  fail:
   _bfd_error_handler
+    /* xgettext:c-format */
     (_("%B: unsupported relocation type %s"),
      abfd, areloc->howto->name);
   bfd_set_error (bfd_error_bad_value);
This page took 0.033777 seconds and 4 git commands to generate.