PR 7011
authorAndreas Schwab <schwab@linux-m68k.org>
Mon, 10 Nov 2008 22:47:58 +0000 (22:47 +0000)
committerAndreas Schwab <schwab@linux-m68k.org>
Mon, 10 Nov 2008 22:47:58 +0000 (22:47 +0000)
* elf.c (assign_file_positions_for_non_load_sections): Handle
PT_GNU_RELRO specially.

bfd/ChangeLog
bfd/elf.c

index b46c8792822fff2110780ebc9e06c6938f79d91c..863a0aff2c01dd627396fb1aa194f1d2907a0c00 100644 (file)
@@ -1,3 +1,9 @@
+2008-11-10  Andreas Schwab  <schwab@suse.de>
+
+       PR 7011
+       * elf.c (assign_file_positions_for_non_load_sections): Handle
+       PT_GNU_RELRO specially.
+
 2008-11-06  Joel Sherrill <joel.sherrill@oarcorp.com>
 
        * config.bfd: Add m32c-*-rtems* and m32r-*-rtems*.
index ea44f7246619defe370c09aed684830850bf7079..2f591f52d5e41aa4e08de5ac419e6e0dd9b3a613 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4631,74 +4631,14 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
        m != NULL;
        m = m->next, p++)
     {
-      if (m->count != 0)
+      if (p->p_type == PT_GNU_RELRO)
        {
-         if (p->p_type != PT_LOAD
-             && (p->p_type != PT_NOTE
-                 || bfd_get_format (abfd) != bfd_core))
-           {
-             Elf_Internal_Shdr *hdr;
-             asection *sect;
-
-             BFD_ASSERT (!m->includes_filehdr && !m->includes_phdrs);
-
-             sect = m->sections[m->count - 1];
-             hdr = &elf_section_data (sect)->this_hdr;
-             p->p_filesz = sect->filepos - m->sections[0]->filepos;
-             if (hdr->sh_type != SHT_NOBITS)
-               p->p_filesz += hdr->sh_size;
-
-             if (p->p_type == PT_GNU_RELRO)
-               {
-                 /* When we get here, we are copying executable
-                    or shared library. But we need to use the same
-                    linker logic.  */
-                 Elf_Internal_Phdr *lp;
+         BFD_ASSERT (!m->includes_filehdr && !m->includes_phdrs);
 
-                 for (lp = phdrs; lp < phdrs + count; ++lp)
-                   {
-                     if (lp->p_type == PT_LOAD
-                         && lp->p_paddr == p->p_paddr)
-                       break;
-                   }
-         
-                 if (lp < phdrs + count)
-                   {
-                     /* We should use p_size if it is valid since it
-                        may contain the first few bytes of the next
-                        SEC_ALLOC section.  */
-                     if (m->p_size_valid)
-                       p->p_filesz = m->p_size;
-                     else
-                       abort ();
-                     p->p_vaddr = lp->p_vaddr;
-                     p->p_offset = lp->p_offset;
-                     p->p_memsz = p->p_filesz;
-                     p->p_align = 1;
-                   }
-                 else
-                   abort ();
-               }
-             else
-               p->p_offset = m->sections[0]->filepos;
-           }
-       }
-      else
-       {
-         if (m->includes_filehdr)
-           {
-             p->p_vaddr = filehdr_vaddr;
-             if (! m->p_paddr_valid)
-               p->p_paddr = filehdr_paddr;
-           }
-         else if (m->includes_phdrs)
-           {
-             p->p_vaddr = phdrs_vaddr;
-             if (! m->p_paddr_valid)
-               p->p_paddr = phdrs_paddr;
-           }
-         else if (p->p_type == PT_GNU_RELRO)
+         if (link_info != NULL)
            {
+             /* During linking the range of the RELRO segment is passed
+                in link_info.  */
              Elf_Internal_Phdr *lp;
 
              for (lp = phdrs; lp < phdrs + count; ++lp)
@@ -4728,6 +4668,67 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
                  p->p_type = PT_NULL;
                }
            }
+         else
+           {
+             /* Otherwise we are copying an executable or shared
+                library. But we need to use the same linker logic.  */
+             Elf_Internal_Phdr *lp;
+
+             for (lp = phdrs; lp < phdrs + count; ++lp)
+               {
+                 if (lp->p_type == PT_LOAD
+                     && lp->p_paddr == p->p_paddr)
+                   break;
+               }
+         
+             if (lp < phdrs + count)
+               {
+                 /* We should use p_size if it is valid since it
+                    may contain the first few bytes of the next
+                    SEC_ALLOC section.  */
+                 if (m->p_size_valid)
+                   p->p_filesz = m->p_size;
+                 else
+                   abort ();
+                 p->p_vaddr = lp->p_vaddr;
+                 p->p_offset = lp->p_offset;
+                 p->p_memsz = p->p_filesz;
+                 p->p_align = 1;
+               }
+             else
+               abort ();
+           }
+       }
+      else if (m->count != 0)
+       {
+         if (p->p_type != PT_LOAD
+             && (p->p_type != PT_NOTE
+                 || bfd_get_format (abfd) != bfd_core))
+           {
+             Elf_Internal_Shdr *hdr;
+             asection *sect;
+
+             BFD_ASSERT (!m->includes_filehdr && !m->includes_phdrs);
+
+             sect = m->sections[m->count - 1];
+             hdr = &elf_section_data (sect)->this_hdr;
+             p->p_filesz = sect->filepos - m->sections[0]->filepos;
+             if (hdr->sh_type != SHT_NOBITS)
+               p->p_filesz += hdr->sh_size;
+             p->p_offset = m->sections[0]->filepos;
+           }
+       }
+      else if (m->includes_filehdr)
+       {
+         p->p_vaddr = filehdr_vaddr;
+         if (! m->p_paddr_valid)
+           p->p_paddr = filehdr_paddr;
+       }
+      else if (m->includes_phdrs)
+       {
+         p->p_vaddr = phdrs_vaddr;
+         if (! m->p_paddr_valid)
+           p->p_paddr = phdrs_paddr;
        }
     }