From: Alan Modra Date: Mon, 19 May 2008 06:06:03 +0000 (+0000) Subject: PR 2995, PR 6473 X-Git-Tag: sid-snapshot-20080601~84 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=c582f2f6cde895affb8c0a716861f7c396d62aaf;p=pf3gnuchains%2Fpf3gnuchains4x.git 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 8246fa7955..ba07dad434 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2008-05-19 Alan Modra + + 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 Add long call support for ARM. diff --git a/bfd/elf.c b/bfd/elf.c index 20f4cb38b8..0280a03903 100644 --- 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++)