From 3281215912fb595a0530d0abe2bffe4513fc8d6b Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 8 Dec 2009 03:43:23 +0000 Subject: [PATCH] * 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. --- bfd/ChangeLog | 6 ++++++ bfd/elf.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 00ae4cf1301..6cbee4ac7b3 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 4a329294ce7..88ebf719266 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; } -- 2.30.2