* elf.c (rewrite_elf_program_header): Don't wrap p_paddr to
authorAlan Modra <amodra@gmail.com>
Fri, 1 Aug 2008 06:39:04 +0000 (06:39 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 1 Aug 2008 06:39:04 +0000 (06:39 +0000)
include file or program headers.

bfd/ChangeLog
bfd/elf.c

index 6f2c8824f25490b5154d1fb6e757c8a01a2fa31e..30b06335dbc43da3fa43b75fb1616c60e6f92d0a 100644 (file)
@@ -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,
index c1517ba8b74d09996edb39c713014c44e57373a2..6b67e16fd43703d306ac964435a615f65d1e3a57 100644 (file)
--- 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;
            }
        }