* 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.
This commit is contained in:
Nick Clifton 2008-11-14 14:44:09 +00:00
parent 4bc2510145
commit 2b0bc0884c
4 changed files with 33 additions and 1 deletions

View 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> 2008-11-14 Tristan Gingold <gingold@adacore.com>
* configure.com: Handle bfd_default_target_size, BFD_HOST_LONG_LONG, * configure.com: Handle bfd_default_target_size, BFD_HOST_LONG_LONG,

View File

@ -4158,6 +4158,7 @@ assign_file_positions_for_load_sections (bfd *abfd,
bfd_size_type maxpagesize; bfd_size_type maxpagesize;
unsigned int alloc; unsigned int alloc;
unsigned int i, j; unsigned int i, j;
bfd_vma header_pad = 0;
if (link_info == NULL if (link_info == NULL
&& !_bfd_elf_map_sections_to_segments (abfd, link_info)) && !_bfd_elf_map_sections_to_segments (abfd, link_info))
@ -4165,7 +4166,11 @@ assign_file_positions_for_load_sections (bfd *abfd,
alloc = 0; alloc = 0;
for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next) 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_phoff = bed->s->sizeof_ehdr;
elf_elfheader (abfd)->e_phentsize = bed->s->sizeof_phdr; 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 = bed->s->sizeof_ehdr;
off += alloc * bed->s->sizeof_phdr; 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; for (m = elf_tdata (abfd)->segment_map, p = phdrs, j = 0;
m != NULL; m != NULL;
@ -4395,6 +4405,11 @@ assign_file_positions_for_load_sections (bfd *abfd,
p->p_filesz += alloc * bed->s->sizeof_phdr; p->p_filesz += alloc * bed->s->sizeof_phdr;
p->p_memsz += 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 if (p->p_type == PT_LOAD
@ -5877,6 +5892,10 @@ copy_elf_program_header (bfd *ibfd, bfd *obfd)
phdr_included = TRUE; 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 if (!map->includes_phdrs
&& !map->includes_filehdr && !map->includes_filehdr
&& map->p_paddr_valid) && map->p_paddr_valid)

View 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> 2008-10-13 Ulrich Weigand <uweigand@de.ibm.com>
* common.h (AT_BASE_PLATFORM, AT_EXECFN): Define. * common.h (AT_BASE_PLATFORM, AT_EXECFN): Define.

View File

@ -266,6 +266,8 @@ struct elf_segment_map
bfd_vma p_align; bfd_vma p_align;
/* Segment size in file and memory */ /* Segment size in file and memory */
bfd_vma p_size; 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 /* Whether the p_flags field is valid; if not, the flags are based
on the section flags. */ on the section flags. */
unsigned int p_flags_valid : 1; unsigned int p_flags_valid : 1;