diff options
author | Alan Modra <amodra@gmail.com> | 2023-03-02 19:59:14 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2023-03-02 21:17:49 +1030 |
commit | 281309f3c8c692d0246f4437ad3c635fe69dbaf7 (patch) | |
tree | a71129f16d377792c38795b8ecc416e9c362ae11 /bfd | |
parent | 0d5adb56c85da38a0f95e872fda05cc6446010c3 (diff) | |
download | gdb-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')
-rw-r--r-- | bfd/elf.c | 26 |
1 files changed, 6 insertions, 20 deletions
@@ -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 |