* elf.c (assign_file_positions_for_segments): For a loadable

section, make sure that the load address is correct relative to
	the load address of the segment plus the size of the segment so
	far.
This commit is contained in:
Ian Lance Taylor 1997-12-11 06:07:10 +00:00
parent 86274b9b5c
commit c63729b518

View File

@ -2124,13 +2124,6 @@ map_sections_to_segments (abfd)
skip a page in the segment, then we need a new segment. */
new_segment = true;
}
else if ((abfd->flags & D_PAGED) == 0)
{
/* If the file is not demand paged, which means that we
don't require the sections to be correctly aligned in the
file, then there is no other reason for a new segment. */
new_segment = false;
}
else if ((last_hdr->flags & SEC_LOAD) == 0
&& (hdr->flags & SEC_LOAD) != 0)
{
@ -2138,6 +2131,13 @@ map_sections_to_segments (abfd)
nonloadable section in the same segment. */
new_segment = true;
}
else if ((abfd->flags & D_PAGED) == 0)
{
/* If the file is not demand paged, which means that we
don't require the sections to be correctly aligned in the
file, then there is no other reason for a new segment. */
new_segment = false;
}
else if (! writable
&& (hdr->flags & SEC_READONLY) == 0
&& (BFD_ALIGN (last_hdr->lma + last_hdr->_raw_size, maxpagesize)
@ -2503,14 +2503,21 @@ assign_file_positions_for_segments (abfd)
{
bfd_vma adjust;
/* The section VMA must equal the file position modulo
the page size. */
if ((flags & SEC_ALLOC) != 0)
if ((flags & SEC_LOAD) != 0)
adjust = sec->lma - (p->p_paddr + p->p_memsz);
else if ((flags & SEC_ALLOC) != 0)
{
/* The section VMA must equal the file position
modulo the page size. FIXME: I'm not sure if
this adjustment is really necessary. We used to
not have the SEC_LOAD case just above, and then
this was necessary, but now I'm not sure. */
if ((abfd->flags & D_PAGED) != 0)
adjust = (sec->vma - voff) % bed->maxpagesize;
else
adjust = (sec->vma - voff) % align;
}
if (adjust != 0)
{
if (i == 0)
@ -2521,11 +2528,15 @@ assign_file_positions_for_segments (abfd)
if ((flags & SEC_LOAD) != 0)
p->p_filesz += adjust;
}
}
sec->filepos = off;
if ((flags & SEC_LOAD) != 0)
/* We check SEC_HAS_CONTENTS here because if NOLOAD is
used in a linker script we may have a section with
SEC_LOAD clear but which is supposed to have
contents. */
if ((flags & SEC_LOAD) != 0
|| (flags & SEC_HAS_CONTENTS) != 0)
off += sec->_raw_size;
if ((flags & SEC_ALLOC) != 0)
voff += sec->_raw_size;
@ -2870,7 +2881,6 @@ prep_headers (abfd)
i_ehdrp->e_machine = EM_CYGNUS_D30V;
break;
/* end-sanitize-d30v */
/* start-sanitize-v850 */
case bfd_arch_v850:
switch (bfd_get_mach (abfd))
{
@ -2878,7 +2888,6 @@ prep_headers (abfd)
case 0: i_ehdrp->e_machine = EM_CYGNUS_V850; break;
}
break;
/* end-sanitize-v850 */
case bfd_arch_arc:
i_ehdrp->e_machine = EM_CYGNUS_ARC;
break;