diff options
author | Alan Modra <amodra@gmail.com> | 2020-02-19 13:14:28 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2020-02-19 13:14:28 +1030 |
commit | b03202e32c8235997b3485b0b4655926ad97a1cc (patch) | |
tree | 0697dbbcfdd4c7b08d717ce5fcc5b640872e0367 /bfd/opncls.c | |
parent | 7c5fa58ea907c46817b915ec8b9b35a180e0e74c (diff) | |
download | gdb-b03202e32c8235997b3485b0b4655926ad97a1cc.zip gdb-b03202e32c8235997b3485b0b4655926ad97a1cc.tar.gz gdb-b03202e32c8235997b3485b0b4655926ad97a1cc.tar.bz2 |
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.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/bfd/opncls.c b/bfd/opncls.c index a03ad51..796202d 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)) |