Make ar faster

* archive.c (_bfd_write_archive_contents): Use a larger buffer in order to improve efficiency.
This commit is contained in:
Oleg Tolmatcev 2023-05-03 16:23:13 +01:00 committed by Nick Clifton
parent 9b0ccb1eba
commit a2243c30bc
2 changed files with 21 additions and 5 deletions

View File

@ -1,3 +1,8 @@
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.

View File

@ -2142,6 +2142,7 @@ _bfd_write_archive_contents (bfd *arch)
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)
@ -2222,16 +2223,23 @@ _bfd_write_archive_contents (bfd *arch)
}
}
#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)
@ -2239,7 +2247,7 @@ _bfd_write_archive_contents (bfd *arch)
while (remaining)
{
size_t amt = DEFAULT_BUFFERSIZE;
size_t amt = AR_WRITE_BUFFERSIZE;
if (amt > remaining)
amt = remaining;
@ -2247,17 +2255,19 @@ _bfd_write_archive_contents (bfd *arch)
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
@ -2281,6 +2291,7 @@ _bfd_write_archive_contents (bfd *arch)
input_err:
bfd_set_input_error (current, bfd_get_error ());
free (buffer);
return false;
}