+2023-05-03 Oleg Tolmatcev <oleg.tolmatcev@gmail.com>
+
+ * archive.c (_bfd_write_archive_contents): Use a larger buffer in
+ order to improve efficiency.
+
2023-05-03 Oleg Tolmatcev <oleg.tolmatcev@gmail.com>
* coffcode.h (coff_read_word_from_buffer): New function.
bfd_size_type wrote;
int tries;
char *armag;
+ char *buffer = NULL;
/* Verify the viability of all entries; if any of them live in the
filesystem (as opposed to living in an archive open for input)
}
}
+#define AR_WRITE_BUFFERSIZE (DEFAULT_BUFFERSIZE * 1024)
+
+ /* FIXME: Find a way to test link_info.reduce_memory_overheads
+ and change the buffer size. */
+ buffer = bfd_malloc (AR_WRITE_BUFFERSIZE);
+ if (buffer == NULL)
+ goto input_err;
+
for (current = arch->archive_head;
current != NULL;
current = current->archive_next)
{
- char buffer[DEFAULT_BUFFERSIZE];
bfd_size_type remaining = arelt_size (current);
/* Write ar header. */
if (!_bfd_write_ar_hdr (arch, current))
- return false;
+ goto input_err;
if (bfd_is_thin_archive (arch))
continue;
if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0)
while (remaining)
{
- size_t amt = DEFAULT_BUFFERSIZE;
+ size_t amt = AR_WRITE_BUFFERSIZE;
if (amt > remaining)
amt = remaining;
if (bfd_bread (buffer, amt, current) != amt)
goto input_err;
if (bfd_bwrite (buffer, amt, arch) != amt)
- return false;
+ goto input_err;
remaining -= amt;
}
if ((arelt_size (current) % 2) == 1)
{
if (bfd_bwrite (&ARFMAG[1], 1, arch) != 1)
- return false;
+ goto input_err;
}
}
+ free (buffer);
+
if (makemap && hasobjects)
{
/* Verify the timestamp in the archive file. If it would not be
input_err:
bfd_set_input_error (current, bfd_get_error ());
+ free (buffer);
return false;
}
\f