From e0fc5c3fcbf0d9e425483c20dc14cf9cedeac3f4 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Thu, 2 Apr 2020 15:49:06 -0400 Subject: gdb: use bfd_get_section_contents to read section contents in is_linked_with_cygwin_dll The function is_linked_with_cygwin_dll currently uses gdb_bfd_map_section to get some section contents. This is not ideal because that memory, which is only used in this function, can't be released. Instead, it was suggested to use bfd_get_full_section_contents. However, bfd_get_full_section_contents returns a newly allocated buffer, which is not very practical to use with C++ automatic memory management constructs. I decided to make gdb_bfd_get_full_section_contents, a small alternative to bfd_get_full_section_contents. It is a small wrapper around bfd_get_section_contents which returns the full contents of the section in a gdb::byte_vector. gdb_bfd_get_full_section_contents could be used at many places that already allocate a vector of the size of the section and then call bfd_get_section_contents. I think these call sites can be updated over time. gdb/ChangeLog: * gdb_bfd.h: Include gdbsupport/byte-vector.h. (gdb_bfd_get_full_section_contents): New declaration. * gdb_bfd.c (gdb_bfd_get_full_section_contents): New function. * windows-tdep.c (is_linked_with_cygwin_dll): Use gdb_bfd_get_full_section_contents. --- gdb/ChangeLog | 8 ++++++++ gdb/gdb_bfd.c | 14 +++++++++++++- gdb/gdb_bfd.h | 9 +++++++++ gdb/windows-tdep.c | 13 ++++++------- 4 files changed, 36 insertions(+), 8 deletions(-) (limited to 'gdb') diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b3ec9c7..e937251 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,13 @@ 2020-04-02 Simon Marchi + * gdb_bfd.h: Include gdbsupport/byte-vector.h. + (gdb_bfd_get_full_section_contents): New declaration. + * gdb_bfd.c (gdb_bfd_get_full_section_contents): New function. + * windows-tdep.c (is_linked_with_cygwin_dll): Use + gdb_bfd_get_full_section_contents. + +2020-04-02 Simon Marchi + * exec.c (build_section_table): Replace internal_error with gdb_assert. (section_table_xfer_memory_partial): Likewise. diff --git a/gdb/gdb_bfd.c b/gdb/gdb_bfd.c index 5a6dee2..26262bf 100644 --- a/gdb/gdb_bfd.c +++ b/gdb/gdb_bfd.c @@ -926,7 +926,19 @@ gdb_bfd_requires_relocations (bfd *abfd) return gdata->needs_relocations; } - +/* See gdb_bfd.h. */ + +bool +gdb_bfd_get_full_section_contents (bfd *abfd, asection *section, + gdb::byte_vector *contents) +{ + bfd_size_type section_size = bfd_section_size (section); + + contents->resize (section_size); + + return bfd_get_section_contents (abfd, section, contents->data (), 0, + section_size); +} /* A callback for htab_traverse that prints a single BFD. */ diff --git a/gdb/gdb_bfd.h b/gdb/gdb_bfd.h index 9b1e292..ce72f78 100644 --- a/gdb/gdb_bfd.h +++ b/gdb/gdb_bfd.h @@ -21,6 +21,7 @@ #define GDB_BFD_H #include "registry.h" +#include "gdbsupport/byte-vector.h" #include "gdbsupport/gdb_ref_ptr.h" DECLARE_REGISTRY (bfd); @@ -181,4 +182,12 @@ int gdb_bfd_count_sections (bfd *abfd); int gdb_bfd_requires_relocations (bfd *abfd); +/* Alternative to bfd_get_full_section_contents that returns the section + contents in *CONTENTS, instead of an allocated buffer. + + Return true on success, false otherwise. */ + +bool gdb_bfd_get_full_section_contents (bfd *abfd, asection *section, + gdb::byte_vector *contents); + #endif /* GDB_BFD_H */ diff --git a/gdb/windows-tdep.c b/gdb/windows-tdep.c index 0042ea3..662a46f 100644 --- a/gdb/windows-tdep.c +++ b/gdb/windows-tdep.c @@ -935,18 +935,17 @@ is_linked_with_cygwin_dll (bfd *abfd) bfd_vma idata_addr = pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress; - /* Map the section's data. */ - bfd_size_type idata_size; - const gdb_byte *const idata_contents - = gdb_bfd_map_section (idata_section, &idata_size); - if (idata_contents == nullptr) + /* Get the section's data. */ + gdb::byte_vector idata_contents; + if (!gdb_bfd_get_full_section_contents (abfd, idata_section, &idata_contents)) { warning (_("Failed to get content of .idata section.")); return false; } - const gdb_byte *iter = idata_contents; - const gdb_byte *end = idata_contents + idata_size; + size_t idata_size = idata_contents.size (); + const gdb_byte *iter = idata_contents.data (); + const gdb_byte *end = idata_contents.data () + idata_size; const pe_import_directory_entry null_dir_entry = { 0 }; /* Iterate through all directory entries. */ -- cgit v1.1