aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2023-03-02 19:59:14 +1030
committerAlan Modra <amodra@gmail.com>2023-03-02 21:17:49 +1030
commit281309f3c8c692d0246f4437ad3c635fe69dbaf7 (patch)
treea71129f16d377792c38795b8ecc416e9c362ae11 /bfd/elf.c
parent0d5adb56c85da38a0f95e872fda05cc6446010c3 (diff)
downloadgdb-281309f3c8c692d0246f4437ad3c635fe69dbaf7.zip
gdb-281309f3c8c692d0246f4437ad3c635fe69dbaf7.tar.gz
gdb-281309f3c8c692d0246f4437ad3c635fe69dbaf7.tar.bz2
Don't write zeros to a gap in the output file
Writing out zeros is counterproductive if a file system supports sparse files. A very large gap need not take much actual disk space, but it usually will if zeros are written. memory_bseek also supports not writing out zeros in a gap. * elf.c (write_zeros): Delete. (assign_file_positions_for_load_sections): Don't call write_zeros. Comment.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r--bfd/elf.c26
1 files changed, 6 insertions, 20 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index 37f331b..409be70 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -5402,22 +5402,6 @@ print_segment_map (const struct elf_segment_map *m)
fflush (stderr);
}
-static bool
-write_zeros (bfd *abfd, file_ptr pos, bfd_size_type len)
-{
- void *buf;
- bool 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. */
@@ -5866,11 +5850,13 @@ assign_file_positions_for_load_sections (bfd *abfd,
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. */
+ Allocate file space for the NOBITS section(s).
+ We don't need to write out the zeros, posix
+ fseek past the end of data already written
+ followed by a write at that location is
+ guaranteed to result in zeros being read
+ from the gap. */
adjust = p->p_memsz - p->p_filesz;
- if (!write_zeros (abfd, off, adjust))
- return false;
}
}
/* We only adjust sh_offset in SHT_NOBITS sections