OSDN Git Service

bfd/
authorNick Clifton <nickc@redhat.com>
Fri, 14 Nov 2008 14:44:08 +0000 (14:44 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 14 Nov 2008 14:44:08 +0000 (14:44 +0000)
        * elf.c (assign_file_positions_for_load_sections): Use header_size
        to avoid moving the load address of file headers.
        (assign_file_positions_for_load_sections): Set header_size for
        segments containing the file header.

        include/elf/
        * internal.h (struct elf_segment_map): Add header_size field.

bfd/ChangeLog
bfd/elf.c
include/elf/ChangeLog
include/elf/internal.h

index 60f7718..4535bfe 100644 (file)
@@ -1,3 +1,10 @@
+2008-11-14  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * elf.c (assign_file_positions_for_load_sections): Use header_size
+       to avoid moving the load address of file headers.
+       (assign_file_positions_for_load_sections): Set header_size for
+       segments containing the file header.
+
 2008-11-14  Tristan Gingold  <gingold@adacore.com>
 
        * configure.com: Handle bfd_default_target_size, BFD_HOST_LONG_LONG, 
index 3d52724..4525faa 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4158,6 +4158,7 @@ assign_file_positions_for_load_sections (bfd *abfd,
   bfd_size_type maxpagesize;
   unsigned int alloc;
   unsigned int i, j;
+  bfd_vma header_pad = 0;
 
   if (link_info == NULL
       && !_bfd_elf_map_sections_to_segments (abfd, link_info))
@@ -4165,7 +4166,11 @@ assign_file_positions_for_load_sections (bfd *abfd,
 
   alloc = 0;
   for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
-    ++alloc;
+    {
+      ++alloc;
+      if (m->header_size)
+       header_pad = m->header_size;
+    }
 
   elf_elfheader (abfd)->e_phoff = bed->s->sizeof_ehdr;
   elf_elfheader (abfd)->e_phentsize = bed->s->sizeof_phdr;
@@ -4208,6 +4213,11 @@ assign_file_positions_for_load_sections (bfd *abfd,
 
   off = bed->s->sizeof_ehdr;
   off += alloc * bed->s->sizeof_phdr;
+  if (header_pad < (bfd_vma) off)
+    header_pad = 0;
+  else
+    header_pad -= off;
+  off += header_pad;
 
   for (m = elf_tdata (abfd)->segment_map, p = phdrs, j = 0;
        m != NULL;
@@ -4395,6 +4405,11 @@ assign_file_positions_for_load_sections (bfd *abfd,
 
          p->p_filesz += alloc * bed->s->sizeof_phdr;
          p->p_memsz += alloc * bed->s->sizeof_phdr;
+         if (m->count)
+           {
+             p->p_filesz += header_pad;
+             p->p_memsz += header_pad;
+           }
        }
 
       if (p->p_type == PT_LOAD
@@ -5877,6 +5892,10 @@ copy_elf_program_header (bfd *ibfd, bfd *obfd)
            phdr_included = TRUE;
        }
 
+      if (map->includes_filehdr && first_section)
+       /* We need to keep the space used by the headers fixed.  */
+       map->header_size = first_section->vma - segment->p_vaddr;
+      
       if (!map->includes_phdrs
          && !map->includes_filehdr
          && map->p_paddr_valid)
index 2699b03..3cfc24f 100644 (file)
@@ -1,3 +1,7 @@
+2008-11-14  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * internal.h (struct elf_segment_map): Add header_size field.
 2008-10-13  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * common.h (AT_BASE_PLATFORM, AT_EXECFN): Define.
index 513f676..9ea175c 100644 (file)
@@ -266,6 +266,8 @@ struct elf_segment_map
   bfd_vma p_align;
   /* Segment size in file and memory */
   bfd_vma p_size;
+  /* Required size of filehdr + phdrs, if non-zero */
+  bfd_vma header_size;
   /* Whether the p_flags field is valid; if not, the flags are based
      on the section flags.  */
   unsigned int p_flags_valid : 1;