aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2008-08-01 06:39:04 +0000
committerAlan Modra <amodra@gmail.com>2008-08-01 06:39:04 +0000
commit010c8431b082740e5156b9623ba9495fc0dd1c52 (patch)
treeec83481332253879383aa1ce920be321ed0d0f2d /bfd
parent3823320924933c184884f72d6a29710cd186d334 (diff)
downloadbinutils-010c8431b082740e5156b9623ba9495fc0dd1c52.zip
binutils-010c8431b082740e5156b9623ba9495fc0dd1c52.tar.gz
binutils-010c8431b082740e5156b9623ba9495fc0dd1c52.tar.bz2
* elf.c (rewrite_elf_program_header): Don't wrap p_paddr to
include file or program headers.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf.c33
2 files changed, 28 insertions, 10 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 6f2c882..30b0633 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2008-08-01 Alan Modra <amodra@bigpond.net.au>
+
+ * elf.c (rewrite_elf_program_header): Don't wrap p_paddr to
+ include file or program headers.
+
2008-07-30 Alan Modra <amodra@bigpond.net.au>
* 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 c1517ba..6b67e16 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;
}
}