summaryrefslogtreecommitdiff
path: root/bfd/opncls.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2020-02-19 13:14:28 +1030
committerAlan Modra <amodra@gmail.com>2020-02-19 13:14:28 +1030
commitb03202e32c8235997b3485b0b4655926ad97a1cc (patch)
tree0697dbbcfdd4c7b08d717ce5fcc5b640872e0367 /bfd/opncls.c
parent7c5fa58ea907c46817b915ec8b9b35a180e0e74c (diff)
downloadbinutils-gdb-b03202e32c8235997b3485b0b4655926ad97a1cc.tar.gz
bfd_get_size cache
We have calls to bfd_get_size when swapping in ELF section headers. Since object files can have a large number of sections, it's worth caching the file size rather than making lots of stat system calls. * bfd.c (struct bfd): Move format and direction to other bitfields. Add "size". * bfdio.c (bfd_get_size): Cache size when not writing file. * opncls.c (bfd_get_debug_link_info_1): Allow for bfd_get_size returning zero, ie. unknown. (bfd_get_alt_debug_link_info): Likewise. * bfd-in2.h: Regenerate.
Diffstat (limited to 'bfd/opncls.c')
-rw-r--r--bfd/opncls.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/bfd/opncls.c b/bfd/opncls.c
index a03ad51c8fa..796202d31a5 100644
--- a/bfd/opncls.c
+++ b/bfd/opncls.c
@@ -1209,6 +1209,7 @@ bfd_get_debug_link_info_1 (bfd *abfd, void *crc32_out)
unsigned int crc_offset;
char *name;
bfd_size_type size;
+ ufile_ptr file_size;
BFD_ASSERT (abfd);
BFD_ASSERT (crc32_out);
@@ -1219,9 +1220,10 @@ bfd_get_debug_link_info_1 (bfd *abfd, void *crc32_out)
return NULL;
size = bfd_section_size (sect);
+ file_size = bfd_get_size (abfd);
/* PR 22794: Make sure that the section has a reasonable size. */
- if (size < 8 || size >= bfd_get_size (abfd))
+ if (size < 8 || (file_size != 0 && size >= file_size))
return NULL;
if (!bfd_malloc_and_get_section (abfd, sect, &contents))
@@ -1298,6 +1300,7 @@ bfd_get_alt_debug_link_info (bfd * abfd, bfd_size_type *buildid_len,
unsigned int buildid_offset;
char *name;
bfd_size_type size;
+ ufile_ptr file_size;
BFD_ASSERT (abfd);
BFD_ASSERT (buildid_len);
@@ -1309,7 +1312,8 @@ bfd_get_alt_debug_link_info (bfd * abfd, bfd_size_type *buildid_len,
return NULL;
size = bfd_section_size (sect);
- if (size < 8 || size >= bfd_get_size (abfd))
+ file_size = bfd_get_size (abfd);
+ if (size < 8 || (file_size != 0 && size >= file_size))
return NULL;
if (!bfd_malloc_and_get_section (abfd, sect, & contents))