* elf.c (write_zeros): New function.

(assign_file_positions_for_load_sections): Allocate file space for
	NOBITS sections that are followed by PROGBITS sections in a segment.
This commit is contained in:
Alan Modra 2009-12-08 03:43:23 +00:00
parent 087d837e04
commit 3281215912
2 changed files with 31 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2009-12-08 Alan Modra <amodra@bigpond.net.au>
* elf.c (write_zeros): New function.
(assign_file_positions_for_load_sections): Allocate file space for
NOBITS sections that are followed by PROGBITS sections in a segment.
2009-12-03 Tristan Gingold <gingold@adacore.com>
* mach-o.c (bfd_mach_o_make_bfd_section): Force debug flags for

View File

@ -4127,6 +4127,22 @@ print_segment_map (const struct elf_segment_map *m)
putc ('\n',stderr);
}
static bfd_boolean
write_zeros (bfd *abfd, file_ptr pos, bfd_size_type len)
{
void *buf;
bfd_boolean ret;
if (bfd_seek (abfd, pos, SEEK_SET) != 0)
return FALSE;
buf = bfd_zmalloc (len);
if (buf == NULL)
return FALSE;
ret = bfd_bwrite (buf, len, abfd) == len;
free (buf);
return ret;
}
/* Assign file positions to the sections based on the mapping from
sections to segments. This function also sets up some fields in
the file header. */
@ -4448,6 +4464,15 @@ assign_file_positions_for_load_sections (bfd *abfd,
if (this_hdr->sh_type != SHT_NOBITS)
{
if (p->p_filesz + adjust < p->p_memsz)
{
/* We have a PROGBITS section following NOBITS ones.
Allocate file space for the NOBITS section(s) and
zero it. */
adjust = p->p_memsz - p->p_filesz;
if (!write_zeros (abfd, off, adjust))
return FALSE;
}
off += adjust;
p->p_filesz += adjust;
}