ld: Add --enable-separate-code
[deliverable/binutils-gdb.git] / bfd / elf.c
index 489e5e2b575204ba524049308fc6c0f48a4de53f..8ea5a81cbe36020d4bc2fc8b880ca83282c5349f 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -355,8 +355,8 @@ bfd_elf_string_from_elf_section (bfd *abfd,
       unsigned int shstrndx = elf_elfheader(abfd)->e_shstrndx;
       _bfd_error_handler
        /* xgettext:c-format */
-       (_("%pB: invalid string offset %u >= %Lu for section `%s'"),
-        abfd, strindex, hdr->sh_size,
+       (_("%pB: invalid string offset %u >= %" PRIu64 " for section `%s'"),
+        abfd, strindex, (uint64_t) hdr->sh_size,
         (shindex == shstrndx && strindex == hdr->sh_name
          ? ".shstrtab"
          : bfd_elf_string_from_elf_section (abfd, shstrndx, hdr->sh_name)));
@@ -659,7 +659,8 @@ setup_group (bfd *abfd, Elf_Internal_Shdr *hdr, asection *newsect)
                      _bfd_error_handler
                        /* xgettext:c-format */
                        (_("%pB: corrupt size field in group section"
-                          " header: %#Lx"), abfd, shdr->sh_size);
+                          " header: %#" PRIx64),
+                        abfd, (uint64_t) shdr->sh_size);
                      bfd_set_error (bfd_error_bad_value);
                      -- num_group;
                      continue;
@@ -674,7 +675,8 @@ setup_group (bfd *abfd, Elf_Internal_Shdr *hdr, asection *newsect)
                      _bfd_error_handler
                        /* xgettext:c-format */
                        (_("%pB: invalid size field in group section"
-                          " header: %#Lx"), abfd, shdr->sh_size);
+                          " header: %#" PRIx64 ""),
+                        abfd, (uint64_t) shdr->sh_size);
                      bfd_set_error (bfd_error_bad_value);
                      -- num_group;
                      /* PR 17510: If the group contents are even
@@ -1387,7 +1389,7 @@ copy_special_section_fields (const bfd *ibfd,
        {
          _bfd_error_handler
            /* xgettext:c-format */
-           (_("%pB: Invalid sh_link field (%d) in section number %d"),
+           (_("%pB: invalid sh_link field (%d) in section number %d"),
             ibfd, iheader->sh_link, secnum);
          return FALSE;
        }
@@ -1403,7 +1405,7 @@ copy_special_section_fields (const bfd *ibfd,
           if we could not find a match ?  */
        _bfd_error_handler
          /* xgettext:c-format */
-         (_("%pB: Failed to find link section for section %d"), obfd, secnum);
+         (_("%pB: failed to find link section for section %d"), obfd, secnum);
     }
 
   if (iheader->sh_info)
@@ -1430,7 +1432,7 @@ copy_special_section_fields (const bfd *ibfd,
       else
        _bfd_error_handler
          /* xgettext:c-format */
-         (_("%pB: Failed to find info section for section %d"), obfd, secnum);
+         (_("%pB: failed to find info section for section %d"), obfd, secnum);
     }
 
   return changed;
@@ -3221,7 +3223,7 @@ elf_fake_sections (bfd *abfd, asection *asect, void *fsarg)
     {
       _bfd_error_handler
        /* xgettext:c-format */
-       (_("%pB: error: Alignment power %d of section `%pA' is too big"),
+       (_("%pB: error: alignment power %d of section `%pA' is too big"),
         abfd, asect->alignment_power, asect);
       arg->failed = TRUE;
       return;
@@ -5470,7 +5472,7 @@ assign_file_positions_for_load_sections (bfd *abfd,
                      && p->p_paddr < (bfd_vma) off))
                {
                  _bfd_error_handler
-                   (_("%pB: Not enough room for program headers,"
+                   (_("%pB: not enough room for program headers,"
                       " try linking with -N"),
                     abfd);
                  bfd_set_error (bfd_error_bad_value);
@@ -5558,8 +5560,8 @@ assign_file_positions_for_load_sections (bfd *abfd,
                {
                  _bfd_error_handler
                    /* xgettext:c-format */
-                   (_("%pB: section %pA lma %#Lx adjusted to %#Lx"),
-                    abfd, sec, s_start, p_end);
+                   (_("%pB: section %pA lma %#" PRIx64 " adjusted to %#" PRIx64),
+                    abfd, sec, (uint64_t) s_start, (uint64_t) p_end);
                  adjust = 0;
                  sec->lma = p_end;
                }
@@ -5857,6 +5859,7 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
       if (p->p_type == PT_GNU_RELRO)
        {
          bfd_vma start, end;
+         bfd_boolean ok;
 
          if (link_info != NULL)
            {
@@ -5879,6 +5882,7 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
              end = 0;
            }
 
+         ok = FALSE;
          if (start < end)
            {
              struct elf_segment_map *lm;
@@ -5900,48 +5904,54 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
                      && lm->sections[0]->vma < end)
                    break;
                }
-             BFD_ASSERT (lm != NULL);
 
-             /* Find the section starting the RELRO segment.  */
-             for (i = 0; i < lm->count; i++)
+             if (lm != NULL)
                {
-                 asection *s = lm->sections[i];
-                 if (s->vma >= start
-                     && s->vma < end
-                     && s->size != 0)
-                   break;
+                 /* Find the section starting the RELRO segment.  */
+                 for (i = 0; i < lm->count; i++)
+                   {
+                     asection *s = lm->sections[i];
+                     if (s->vma >= start
+                         && s->vma < end
+                         && s->size != 0)
+                       break;
+                   }
+
+                 if (i < lm->count)
+                   {
+                     p->p_vaddr = lm->sections[i]->vma;
+                     p->p_paddr = lm->sections[i]->lma;
+                     p->p_offset = lm->sections[i]->filepos;
+                     p->p_memsz = end - p->p_vaddr;
+                     p->p_filesz = p->p_memsz;
+
+                     /* The RELRO segment typically ends a few bytes
+                        into .got.plt but other layouts are possible.
+                        In cases where the end does not match any
+                        loaded section (for instance is in file
+                        padding), trim p_filesz back to correspond to
+                        the end of loaded section contents.  */
+                     if (p->p_filesz > lp->p_vaddr + lp->p_filesz - p->p_vaddr)
+                       p->p_filesz = lp->p_vaddr + lp->p_filesz - p->p_vaddr;
+
+                     /* Preserve the alignment and flags if they are
+                        valid.  The gold linker generates RW/4 for
+                        the PT_GNU_RELRO section.  It is better for
+                        objcopy/strip to honor these attributes
+                        otherwise gdb will choke when using separate
+                        debug files.  */
+                     if (!m->p_align_valid)
+                       p->p_align = 1;
+                     if (!m->p_flags_valid)
+                       p->p_flags = PF_R;
+                     ok = TRUE;
+                   }
                }
-             BFD_ASSERT (i < lm->count);
-
-             p->p_vaddr = lm->sections[i]->vma;
-             p->p_paddr = lm->sections[i]->lma;
-             p->p_offset = lm->sections[i]->filepos;
-             p->p_memsz = end - p->p_vaddr;
-             p->p_filesz = p->p_memsz;
-
-             /* The RELRO segment typically ends a few bytes into
-                .got.plt but other layouts are possible.  In cases
-                where the end does not match any loaded section (for
-                instance is in file padding), trim p_filesz back to
-                correspond to the end of loaded section contents.  */
-             if (p->p_filesz > lp->p_vaddr + lp->p_filesz - p->p_vaddr)
-               p->p_filesz = lp->p_vaddr + lp->p_filesz - p->p_vaddr;
-
-             /* Preserve the alignment and flags if they are valid. The
-                gold linker generates RW/4 for the PT_GNU_RELRO section.
-                It is better for objcopy/strip to honor these attributes
-                otherwise gdb will choke when using separate debug files.
-              */
-             if (!m->p_align_valid)
-               p->p_align = 1;
-             if (!m->p_flags_valid)
-               p->p_flags = PF_R;
-           }
-         else
-           {
-             memset (p, 0, sizeof *p);
-             p->p_type = PT_NULL;
            }
+         if (link_info != NULL)
+           BFD_ASSERT (ok);
+         if (!ok)
+           memset (p, 0, sizeof *p);
        }
       else if (p->p_type == PT_GNU_STACK)
        {
@@ -6117,9 +6127,7 @@ 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.  */
+      alloc = elf_elfheader (abfd)->e_phnum;
       if (alloc == 0)
        return TRUE;
 
@@ -6141,14 +6149,14 @@ assign_file_positions_except_relocs (bfd *abfd,
                                                        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)))
+             || (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 (_("\
-%pB: error: PHDR segment not covered by LOAD segment"),
+         _bfd_error_handler (_("%pB: error: PHDR segment not covered"
+                               " by LOAD segment"),
                              abfd);
          return FALSE;
        }
@@ -6835,9 +6843,10 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
          if (segment->p_type == PT_LOAD
              && (segment->p_filesz > 0 || segment->p_memsz == 0))
            /* xgettext:c-format */
-           _bfd_error_handler (_("%pB: warning: Empty loadable segment detected"
-                                 " at vaddr=%#Lx, is this intentional?"),
-                               ibfd, segment->p_vaddr);
+           _bfd_error_handler
+             (_("%pB: warning: empty loadable segment detected"
+                " at vaddr=%#" PRIx64 ", is this intentional?"),
+              ibfd, (uint64_t) segment->p_vaddr);
 
          map->count = 0;
          *pointer_to_map = map;
@@ -7449,9 +7458,9 @@ rewrite:
            /* PR 17512: file: f17299af.  */
            if (segment->p_align > (bfd_vma) 1 << ((sizeof (bfd_vma) * 8) - 2))
              /* xgettext:c-format */
-             _bfd_error_handler (_("%pB: warning: segment alignment of %#Lx"
-                                   " is too large"),
-                                 ibfd, segment->p_align);
+             _bfd_error_handler (_("%pB: warning: segment alignment of %#"
+                                   PRIx64 " is too large"),
+                                 ibfd, (uint64_t) segment->p_align);
            else
              maxpagesize = segment->p_align;
          }
@@ -7947,10 +7956,11 @@ error_return:
                  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>",
-                                         sec->name);
+                     _bfd_error_handler
+                       (_("unable to find equivalent output section"
+                          " for symbol '%s' from section '%s'"),
+                        syms[idx]->name ? syms[idx]->name : "<Local sym>",
+                        sec->name);
                      bfd_set_error (bfd_error_invalid_operation);
                      goto error_return;
                    }
@@ -8860,12 +8870,13 @@ _bfd_elf_set_section_contents (bfd *abfd,
   return TRUE;
 }
 
-void
+bfd_boolean
 _bfd_elf_no_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
                           arelent *cache_ptr ATTRIBUTE_UNUSED,
                           Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
 {
   abort ();
+  return FALSE;
 }
 
 /* Try to convert a non-ELF reloc into an ELF one.  */
@@ -8957,10 +8968,9 @@ _bfd_elf_validate_reloc (bfd *abfd, arelent *areloc)
   return TRUE;
 
  fail:
-  _bfd_error_handler
-    /* xgettext:c-format */
-    (_("%pB: unsupported relocation type %s"),
-     abfd, areloc->howto->name);
+  /* xgettext:c-format */
+  _bfd_error_handler (_("%pB: %s unsupported"),
+                     abfd, areloc->howto->name);
   bfd_set_error (bfd_error_bad_value);
   return FALSE;
 }
This page took 0.030331 seconds and 4 git commands to generate.