PR ld/14207
authorAlan Modra <amodra@gmail.com>
Tue, 3 Jul 2012 05:47:35 +0000 (05:47 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 3 Jul 2012 05:47:35 +0000 (05:47 +0000)
* elf.c (assign_file_positions_for_load_sections): Remove assertions
that only PT_LOAD headers include file header and section headers.
(assign_file_positions_for_non_load_sections): Similarly don't
assert PT_GNU_RELRO header does not include file and section headers.
Compare first section vma rather than PT_LOAD p_vaddr against
relro_start when looking for PT_LOAD covering PT_GNU_RELRO.  Replace
abort with assertion.

bfd/ChangeLog
bfd/elf.c

index b594c66..fc9c386 100644 (file)
@@ -1,3 +1,14 @@
+2012-07-03  Alan Modra  <amodra@gmail.com>
+
+       PR ld/14207
+       * elf.c (assign_file_positions_for_load_sections): Remove assertions
+       that only PT_LOAD headers include file header and section headers.
+       (assign_file_positions_for_non_load_sections): Similarly don't
+       assert PT_GNU_RELRO header does not include file and section headers.
+       Compare first section vma rather than PT_LOAD p_vaddr against
+       relro_start when looking for PT_LOAD covering PT_GNU_RELRO.  Replace
+       abort with assertion.
+
 2012-07-02  Alan Modra  <amodra@gmail.com>
 
        * elf32-m32c.c (m32c_elf_check_relocs): Use bfd_make_section
index cb3f72f..588e73f 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4575,8 +4575,6 @@ assign_file_positions_for_load_sections (bfd *abfd,
          p->p_memsz = bed->s->sizeof_ehdr;
          if (m->count > 0)
            {
-             BFD_ASSERT (p->p_type == PT_LOAD);
-
              if (p->p_vaddr < (bfd_vma) off)
                {
                  (*_bfd_error_handler)
@@ -4603,7 +4601,6 @@ assign_file_positions_for_load_sections (bfd *abfd,
 
              if (m->count > 0)
                {
-                 BFD_ASSERT (p->p_type == PT_LOAD);
                  p->p_vaddr -= off - p->p_offset;
                  if (!m->p_paddr_valid)
                    p->p_paddr -= off - p->p_offset;
@@ -4965,26 +4962,27 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
       if (p->p_type == PT_GNU_RELRO)
        {
          const Elf_Internal_Phdr *lp;
-
-         BFD_ASSERT (!m->includes_filehdr && !m->includes_phdrs);
+         struct elf_segment_map *lm;
 
          if (link_info != NULL)
            {
              /* During linking the range of the RELRO segment is passed
                 in link_info.  */
-             for (lp = phdrs; lp < phdrs + count; ++lp)
+             for (lm = elf_tdata (abfd)->segment_map, lp = phdrs;
+                  lm != NULL;
+                  lm = lm->next, lp++)
                {
                  if (lp->p_type == PT_LOAD
-                     && lp->p_vaddr >= link_info->relro_start
                      && lp->p_vaddr < link_info->relro_end
-                     && lp->p_vaddr + lp->p_filesz >= link_info->relro_end)
+                     && lp->p_vaddr + lp->p_filesz >= link_info->relro_end
+                     && lm->count != 0
+                     && lm->sections[0]->vma >= link_info->relro_start)
                    break;
                }
 
              /* PR ld/14207.  If the RELRO segment doesn't fit in the
                 LOAD segment, it should be removed.  */
-             if (lp == (phdrs + count))
-               abort ();
+             BFD_ASSERT (lm != NULL);
            }
          else
            {