PR 2995, PR 6473
authorAlan Modra <amodra@gmail.com>
Mon, 19 May 2008 06:06:03 +0000 (06:06 +0000)
committerAlan Modra <amodra@gmail.com>
Mon, 19 May 2008 06:06:03 +0000 (06:06 +0000)
* elf.c (_bfd_elf_make_section_from_shdr): Leave lma equal to
vma when all p_paddr fields are zero and there is more than
one PT_LOAD header.

bfd/ChangeLog
bfd/elf.c

index 8246fa7..ba07dad 100644 (file)
@@ -1,3 +1,10 @@
+2008-05-19  Alan Modra  <amodra@bigpond.net.au>
+
+       PR 2995, PR 6473
+       * elf.c (_bfd_elf_make_section_from_shdr): Leave lma equal to
+       vma when all p_paddr fields are zero and there is more than
+       one PT_LOAD header.
+
 2008-05-15  Christophe Lyon  <christophe.lyon@st.com>
 
        Add long call support for ARM.
index 20f4cb3..0280a03 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -948,7 +948,20 @@ _bfd_elf_make_section_from_shdr (bfd *abfd,
   if ((flags & SEC_ALLOC) != 0)
     {
       Elf_Internal_Phdr *phdr;
-      unsigned int i;
+      unsigned int i, nload;
+
+      /* Some ELF linkers produce binaries with all the program header
+        p_paddr fields zero.  If we have such a binary with more than
+        one PT_LOAD header, then leave the section lma equal to vma
+        so that we don't create sections with overlapping lma.  */
+      phdr = elf_tdata (abfd)->phdr;
+      for (nload = 0, i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
+       if (phdr->p_paddr != 0)
+         break;
+       else if (phdr->p_type == PT_LOAD && phdr->p_memsz != 0)
+         ++nload;
+      if (i >= elf_elfheader (abfd)->e_phnum && nload > 1)
+       return TRUE;
 
       phdr = elf_tdata (abfd)->phdr;
       for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)