From: Alan Modra Date: Fri, 1 Aug 2008 06:39:04 +0000 (+0000) Subject: * elf.c (rewrite_elf_program_header): Don't wrap p_paddr to X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=010c8431b082740e5156b9623ba9495fc0dd1c52;p=binutils-gdb.git * elf.c (rewrite_elf_program_header): Don't wrap p_paddr to include file or program headers. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 6f2c8824f25..30b06335dbc 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2008-08-01 Alan Modra + + * elf.c (rewrite_elf_program_header): Don't wrap p_paddr to + include file or program headers. + 2008-07-30 Alan Modra * coff-ppc.c, coffgen.c, ecoff.c, ecofflink.c, elf.c, elf32-frv.c, diff --git a/bfd/elf.c b/bfd/elf.c index c1517ba8b74..6b67e16fd43 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -5559,19 +5559,32 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd) /* Offset the segment physical address from the lma to allow for space taken up by elf headers. */ if (map->includes_filehdr) - map->p_paddr -= iehdr->e_ehsize; + { + if (map->p_paddr >= iehdr->e_ehsize) + map->p_paddr -= iehdr->e_ehsize; + else + { + map->includes_filehdr = FALSE; + map->includes_phdrs = FALSE; + } + } if (map->includes_phdrs) { - map->p_paddr -= iehdr->e_phnum * iehdr->e_phentsize; - - /* iehdr->e_phnum is just an estimate of the number - of program headers that we will need. Make a note - here of the number we used and the segment we chose - to hold these headers, so that we can adjust the - offset when we know the correct value. */ - phdr_adjust_num = iehdr->e_phnum; - phdr_adjust_seg = map; + if (map->p_paddr >= iehdr->e_phnum * iehdr->e_phentsize) + { + map->p_paddr -= iehdr->e_phnum * iehdr->e_phentsize; + + /* iehdr->e_phnum is just an estimate of the number + of program headers that we will need. Make a note + here of the number we used and the segment we chose + to hold these headers, so that we can adjust the + offset when we know the correct value. */ + phdr_adjust_num = iehdr->e_phnum; + phdr_adjust_seg = map; + } + else + map->includes_phdrs = FALSE; } }