gdb: use bfd_get_section_contents to read section contents in is_linked_with_cygwin_dll
authorSimon Marchi <simon.marchi@polymtl.ca>
Thu, 2 Apr 2020 19:49:06 +0000 (15:49 -0400)
committerSimon Marchi <simon.marchi@polymtl.ca>
Thu, 2 Apr 2020 19:49:06 +0000 (15:49 -0400)
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
gdb/gdb_bfd.c
gdb/gdb_bfd.h
gdb/windows-tdep.c

index b3ec9c78b07edd40b1cad13ced9f76fa53d33987..e93725129d57caaac548883c05820e86e6de7f81 100644 (file)
@@ -1,3 +1,11 @@
+2020-04-02  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       * 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  <simon.marchi@polymtl.ca>
 
        * exec.c (build_section_table): Replace internal_error with
index 5a6dee2d51a8eb861768bc4aaf0b3b1a36bbc69a..26262bfedf648f4ca4eecef0e8754d57a416a731 100644 (file)
@@ -926,7 +926,19 @@ gdb_bfd_requires_relocations (bfd *abfd)
   return gdata->needs_relocations;
 }
 
-\f
+/* 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.  */
 
index 9b1e292bf18f680bcbe0560871a4ed2cba3c69ec..ce72f78a23f3d77c655a8db69f2f40763d5b70ce 100644 (file)
@@ -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 */
index 0042ea350e80b70930bcd7774e34fccac580a72d..662a46fe1d702ed4bace839c7bfa33567db8b89f 100644 (file)
@@ -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.  */