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.
This commit is contained in:
Alan Modra 2008-05-19 06:06:03 +00:00
parent 3ea4a8cb4b
commit 6ffd79000b
2 changed files with 21 additions and 1 deletions

View 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.

View File

@ -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++)