diff options
author | Alan Modra <amodra@gmail.com> | 2008-05-19 06:06:03 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2008-05-19 06:06:03 +0000 |
commit | 6ffd79000b45e77b3625143932ffbf781b6aecab (patch) | |
tree | ea06bdf301bb4c57edb1a004dd9117eece27e608 /bfd/elf.c | |
parent | 3ea4a8cb4ba46099caa26e67b78c68e88b4dc535 (diff) | |
download | gdb-6ffd79000b45e77b3625143932ffbf781b6aecab.zip gdb-6ffd79000b45e77b3625143932ffbf781b6aecab.tar.gz gdb-6ffd79000b45e77b3625143932ffbf781b6aecab.tar.bz2 |
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.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r-- | bfd/elf.c | 15 |
1 files changed, 14 insertions, 1 deletions
@@ -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++) |