PR25662, invalid sh_offset for first section in segment with phdrs

PR 25662
	* elf.c (assign_file_positions_for_load_sections): Adjust offset
	for SHT_NOBITS section if first in segment.
This commit is contained in:
Alan Modra 2020-03-24 10:42:45 +10:30
parent 0d4a4bc56f
commit d16e3d2e5b
2 changed files with 26 additions and 4 deletions

View file

@ -1,3 +1,9 @@
2020-03-25 Alan Modra <amodra@gmail.com>
PR 25662
* elf.c (assign_file_positions_for_load_sections): Adjust offset
for SHT_NOBITS section if first in segment.
2020-03-24 H.J. Lu <hongjiu.lu@intel.com> 2020-03-24 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/25708 PR binutils/25708

View file

@ -5833,10 +5833,11 @@ assign_file_positions_for_load_sections (bfd *abfd,
} }
p->p_memsz += adjust; p->p_memsz += adjust;
if (this_hdr->sh_type != SHT_NOBITS) if (p->p_type == PT_LOAD)
{ {
if (p->p_type == PT_LOAD) if (this_hdr->sh_type != SHT_NOBITS)
{ {
off_adjust = 0;
if (p->p_filesz + adjust < p->p_memsz) if (p->p_filesz + adjust < p->p_memsz)
{ {
/* We have a PROGBITS section following NOBITS ones. /* We have a PROGBITS section following NOBITS ones.
@ -5846,10 +5847,25 @@ assign_file_positions_for_load_sections (bfd *abfd,
if (!write_zeros (abfd, off, adjust)) if (!write_zeros (abfd, off, adjust))
return FALSE; return FALSE;
} }
off += adjust;
} }
p->p_filesz += adjust; /* We only adjust sh_offset in SHT_NOBITS sections
as would seem proper for their address when the
section is first in the segment. sh_offset
doesn't really have any significance for
SHT_NOBITS anyway, apart from a notional position
relative to other sections. Historically we
didn't bother with adjusting sh_offset and some
programs depend on it not being adjusted. See
pr12921 and pr25662. */
if (this_hdr->sh_type != SHT_NOBITS || i == 0)
{
off += adjust;
if (this_hdr->sh_type == SHT_NOBITS)
off_adjust += adjust;
}
} }
if (this_hdr->sh_type != SHT_NOBITS)
p->p_filesz += adjust;
} }
if (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core) if (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core)