gdb: move bfd_open_from_target_memory to gdb_bfd
authorMihails Strasuns <mihails.strasuns@intel.com>
Mon, 7 Dec 2020 19:54:03 +0000 (20:54 +0100)
committerMihails Strasuns <mihails.strasuns@intel.com>
Thu, 10 Dec 2020 10:18:00 +0000 (11:18 +0100)
This function allows to create a BFD handle using an accessible memory
range in a target memory.  It is currently contained in a JIT module but
this functionality may be of wider usefullness - for example, reading
ELF binaries contained within a core dump.

gdb/ChangeLog:
2020-12-07  Mihails Strasuns  <mihails.strasuns@intel.com>

* jit.c (mem_bfd*, bfd_open_from_target_memory): Removed.
* gdb_bfd.h (gdb_bfd_open_from_target_memory): New function.
* gdb_bfd.c (mem_bfd*, gdb_bfd_open_from_target_memory): New functions.

gdb/ChangeLog
gdb/gdb_bfd.c
gdb/gdb_bfd.h
gdb/jit.c

index 1f98f5f46dcc736011ac532c3928cd2bde4e1d60..93529546e3f0d519c689c5b6e124ceea3c554cb1 100644 (file)
@@ -1,3 +1,9 @@
+2020-12-07  Mihails Strasuns  <mihails.strasuns@intel.com>
+
+       * jit.c (mem_bfd*, bfd_open_from_target_memory): Removed.
+       * gdb_bfd.h (gdb_bfd_open_from_target_memory): New function.
+       * gdb_bfd.c (mem_bfd*, gdb_bfd_open_from_target_memory): New functions. 
+
 2020-12-09  Tom Tromey  <tromey@adacore.com>
 
        * ada-lang.c (ada_lookup_encoded_symbol): Use add_angle_brackets.
index a61656a6ffe2e5df11a45f039f2e936f84e458b1..0ea82c95b876c58144039a93d2dccc54be05ce93 100644 (file)
@@ -207,6 +207,91 @@ gdb_bfd_has_target_filename (struct bfd *abfd)
   return is_target_filename (bfd_get_filename (abfd));
 }
 
+/* For `gdb_bfd_open_from_target_memory`.  */
+
+struct target_buffer
+{
+  CORE_ADDR base;
+  ULONGEST size;
+};
+
+/* For `gdb_bfd_open_from_target_memory`.  Opening the file is a no-op.  */
+
+static void *
+mem_bfd_iovec_open (struct bfd *abfd, void *open_closure)
+{
+  return open_closure;
+}
+
+/* For `gdb_bfd_open_from_target_memory`.  Closing the file is just freeing the
+   base/size pair on our side.  */
+
+static int
+mem_bfd_iovec_close (struct bfd *abfd, void *stream)
+{
+  xfree (stream);
+
+  /* Zero means success.  */
+  return 0;
+}
+
+/* For `gdb_bfd_open_from_target_memory`.  For reading the file, we just need to
+   pass through to target_read_memory and fix up the arguments and return
+   values.  */
+
+static file_ptr
+mem_bfd_iovec_pread (struct bfd *abfd, void *stream, void *buf,
+                    file_ptr nbytes, file_ptr offset)
+{
+  int err;
+  struct target_buffer *buffer = (struct target_buffer *) stream;
+
+  /* If this read will read all of the file, limit it to just the rest.  */
+  if (offset + nbytes > buffer->size)
+    nbytes = buffer->size - offset;
+
+  /* If there are no more bytes left, we've reached EOF.  */
+  if (nbytes == 0)
+    return 0;
+
+  err = target_read_memory (buffer->base + offset, (gdb_byte *) buf, nbytes);
+  if (err)
+    return -1;
+
+  return nbytes;
+}
+
+/* For `gdb_bfd_open_from_target_memory`.  For statting the file, we only
+   support the st_size attribute.  */
+
+static int
+mem_bfd_iovec_stat (struct bfd *abfd, void *stream, struct stat *sb)
+{
+  struct target_buffer *buffer = (struct target_buffer*) stream;
+
+  memset (sb, 0, sizeof (struct stat));
+  sb->st_size = buffer->size;
+  return 0;
+}
+
+/* See gdb_bfd.h.  */
+
+gdb_bfd_ref_ptr
+gdb_bfd_open_from_target_memory (CORE_ADDR addr, ULONGEST size,
+                                const char *target,
+                                const char *filename)
+{
+  struct target_buffer *buffer = XNEW (struct target_buffer);
+
+  buffer->base = addr;
+  buffer->size = size;
+  return gdb_bfd_openr_iovec (filename ? filename : "<in-memory>", target,
+                             mem_bfd_iovec_open,
+                             buffer,
+                             mem_bfd_iovec_pread,
+                             mem_bfd_iovec_close,
+                             mem_bfd_iovec_stat);
+}
 
 /* Return the system error number corresponding to ERRNUM.  */
 
index 123309708736cda6c140ffb1f50882e00775fa58..5c1a9548edc63103ecd8bc312612c3eeec1519b9 100644 (file)
@@ -194,6 +194,12 @@ int gdb_bfd_requires_relocations (bfd *abfd);
 bool gdb_bfd_get_full_section_contents (bfd *abfd, asection *section,
                                        gdb::byte_vector *contents);
 
+/* Create and initialize a BFD handle from a target in-memory range.  */
+
+gdb_bfd_ref_ptr gdb_bfd_open_from_target_memory (CORE_ADDR addr, ULONGEST size,
+                                                const char *target,
+                                                const char *filename = nullptr);
+
 /* Range adapter for a BFD's sections.
 
    To be used as:
index 9deeed7ab597adf607b039d2e6da12a4fcaaf591..e36b3c3b68af6880db3c29f31b273ea7cbaac03d 100644 (file)
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -69,86 +69,6 @@ show_jit_debug (struct ui_file *file, int from_tty,
   fprintf_filtered (file, _("JIT debugging is %s.\n"), value);
 }
 
-struct target_buffer
-{
-  CORE_ADDR base;
-  ULONGEST size;
-};
-
-/* Opening the file is a no-op.  */
-
-static void *
-mem_bfd_iovec_open (struct bfd *abfd, void *open_closure)
-{
-  return open_closure;
-}
-
-/* Closing the file is just freeing the base/size pair on our side.  */
-
-static int
-mem_bfd_iovec_close (struct bfd *abfd, void *stream)
-{
-  xfree (stream);
-
-  /* Zero means success.  */
-  return 0;
-}
-
-/* For reading the file, we just need to pass through to target_read_memory and
-   fix up the arguments and return values.  */
-
-static file_ptr
-mem_bfd_iovec_pread (struct bfd *abfd, void *stream, void *buf,
-                    file_ptr nbytes, file_ptr offset)
-{
-  int err;
-  struct target_buffer *buffer = (struct target_buffer *) stream;
-
-  /* If this read will read all of the file, limit it to just the rest.  */
-  if (offset + nbytes > buffer->size)
-    nbytes = buffer->size - offset;
-
-  /* If there are no more bytes left, we've reached EOF.  */
-  if (nbytes == 0)
-    return 0;
-
-  err = target_read_memory (buffer->base + offset, (gdb_byte *) buf, nbytes);
-  if (err)
-    return -1;
-
-  return nbytes;
-}
-
-/* For statting the file, we only support the st_size attribute.  */
-
-static int
-mem_bfd_iovec_stat (struct bfd *abfd, void *stream, struct stat *sb)
-{
-  struct target_buffer *buffer = (struct target_buffer*) stream;
-
-  memset (sb, 0, sizeof (struct stat));
-  sb->st_size = buffer->size;
-  return 0;
-}
-
-/* Open a BFD from the target's memory.  */
-
-static gdb_bfd_ref_ptr
-bfd_open_from_target_memory (CORE_ADDR addr, ULONGEST size,
-                            const char *target)
-{
-  struct target_buffer *buffer = XNEW (struct target_buffer);
-
-  buffer->base = addr;
-  buffer->size = size;
-  return gdb_bfd_openr_iovec ("<in-memory>", target,
-                             mem_bfd_iovec_open,
-                             buffer,
-                             mem_bfd_iovec_pread,
-                             mem_bfd_iovec_close,
-                             mem_bfd_iovec_stat);
-}
-
 struct jit_reader
 {
   jit_reader (struct gdb_reader_funcs *f, gdb_dlhandle_up &&h)
@@ -773,9 +693,8 @@ jit_bfd_try_read_symtab (struct jit_code_entry *code_entry,
                        paddress (gdbarch, code_entry->symfile_addr),
                        pulongest (code_entry->symfile_size));
 
-  gdb_bfd_ref_ptr nbfd (bfd_open_from_target_memory (code_entry->symfile_addr,
-                                                    code_entry->symfile_size,
-                                                    gnutarget));
+  gdb_bfd_ref_ptr nbfd (gdb_bfd_open_from_target_memory
+      (code_entry->symfile_addr, code_entry->symfile_size, gnutarget));
   if (nbfd == NULL)
     {
       puts_unfiltered (_("Error opening JITed symbol file, ignoring it.\n"));