OSDN Git Service

* elf.c (rewrite_elf_program_header): Don't wrap p_paddr to
authoramodra <amodra>
Fri, 1 Aug 2008 06:39:03 +0000 (06:39 +0000)
committeramodra <amodra>
Fri, 1 Aug 2008 06:39:03 +0000 (06:39 +0000)
include file or program headers.

bfd/ChangeLog
bfd/elf.c

index 6f2c882..30b0633 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 c1517ba..6b67e16 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;
            }
        }