Don't write zeros to a gap in the output file
authorAlan Modra <amodra@gmail.com>
Thu, 2 Mar 2023 09:29:14 +0000 (19:59 +1030)
committerAlan Modra <amodra@gmail.com>
Thu, 2 Mar 2023 10:47:49 +0000 (21:17 +1030)
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.

bfd/elf.c

index 37f331b98cdf5101d8e9a1a28425c264cbf0a3a4..409be7068ec395f67adc286e1c603cdb607a08eb 100644 (file)
--- 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