* elf.c (assign_file_positions_for_segments): Fix case where extra
authorIan Lance Taylor <ian@airs.com>
Wed, 29 Nov 1995 19:14:33 +0000 (19:14 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 29 Nov 1995 19:14:33 +0000 (19:14 +0000)
program headers were allocated.

bfd/ChangeLog
bfd/elf.c

index 7e5b6947f3605f9c55914fd9dd34e90376f62cf8..d9c4856c47f8878827c58cc12a8534b116e4bc04 100644 (file)
@@ -1,5 +1,8 @@
 Wed Nov 29 12:42:36 1995  Ian Lance Taylor  <ian@cygnus.com>
 
+       * elf.c (assign_file_positions_for_segments): Fix case where extra
+       program headers were allocated.
+
        * elf.c (_bfd_elf_print_private_bfd_data): New function.
        * elf-bfd.h (_bfd_elf_print_private_bfd_data): Declare.
        * elfxx-target.h (bfd_elfNN_bfd_print_private_bfd_data): Define to
index b00997fa5259a06777d8f6f8d1da6d56f8e6bf66..ba00bc8d0ce6dd3cfb4b1ea5e7a93928c5fe988c 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -1835,13 +1835,15 @@ assign_file_positions_for_segments (abfd)
     {
       unsigned int i;
       asection **secpp;
-      boolean adjusted;
 
       p->p_type = m->p_type;
 
       if (m->p_flags_valid)
        p->p_flags = m->p_flags;
 
+      if (p->p_type == PT_LOAD && m->count > 0)
+       off += (m->sections[0]->vma - off) % bed->maxpagesize;
+
       if (m->count == 0)
        p->p_vaddr = 0;
       else
@@ -1864,7 +1866,6 @@ assign_file_positions_for_segments (abfd)
       p->p_filesz = 0;
       p->p_memsz = 0;
 
-      adjusted = false;
       if (p->p_type == PT_LOAD)
        {
          p->p_offset = off;
@@ -1890,7 +1891,6 @@ assign_file_positions_for_segments (abfd)
                      p->p_memsz = off;
                      p->p_vaddr -= off;
                      p->p_paddr -= off;
-                     adjusted = true;
                    }
                  if (mi->p_type == PT_PHDR)
                    pi_phdr = pi;
@@ -1927,14 +1927,11 @@ assign_file_positions_for_segments (abfd)
              adjust = (sec->vma - off) % bed->maxpagesize;
              if (adjust != 0)
                {
-                 if (i == 0 && ! adjusted)
-                   p->p_offset += adjust;
-                 else
-                   {
-                     p->p_memsz += adjust;
-                     if ((flags & SEC_LOAD) != 0)
-                       p->p_filesz += adjust;
-                   }
+                 if (i == 0)
+                   abort ();
+                 p->p_memsz += adjust;
+                 if ((flags & SEC_LOAD) != 0)
+                   p->p_filesz += adjust;
                  off += adjust;
                }