From: Alan Modra Date: Tue, 8 Dec 2009 03:43:23 +0000 (+0000) Subject: * elf.c (write_zeros): New function. X-Git-Tag: cgen-snapshot-20100101~100 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3281215912fb595a0530d0abe2bffe4513fc8d6b;p=external%2Fbinutils.git * 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 00ae4cf..6cbee4a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2009-12-08 Alan Modra + + * 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 * mach-o.c (bfd_mach_o_make_bfd_section): Force debug flags for diff --git a/bfd/elf.c b/bfd/elf.c index 4a32929..88ebf71 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -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; }