Share code on to_xfer_partial for tfile and ctf target
[deliverable/binutils-gdb.git] / gdb / exec.c
index 7f53a5077699c0c4601ec63a07005979c587524c..74c61eb8105be8295da3813dd0e5897072fb0d04 100644 (file)
@@ -530,6 +530,53 @@ remove_target_sections (void *owner)
 
 \f
 
+enum target_xfer_status
+exec_read_partial_read_only (gdb_byte *readbuf, ULONGEST offset,
+                            ULONGEST len, ULONGEST *xfered_len)
+{
+  /* It's unduly pedantic to refuse to look at the executable for
+     read-only pieces; so do the equivalent of readonly regions aka
+     QTro packet.  */
+  if (exec_bfd != NULL)
+    {
+      asection *s;
+      bfd_size_type size;
+      bfd_vma vma;
+
+      for (s = exec_bfd->sections; s; s = s->next)
+       {
+         if ((s->flags & SEC_LOAD) == 0
+             || (s->flags & SEC_READONLY) == 0)
+           continue;
+
+         vma = s->vma;
+         size = bfd_get_section_size (s);
+         if (vma <= offset && offset < (vma + size))
+           {
+             ULONGEST amt;
+
+             amt = (vma + size) - offset;
+             if (amt > len)
+               amt = len;
+
+             amt = bfd_get_section_contents (exec_bfd, s,
+                                             readbuf, offset - vma, amt);
+
+             if (amt == 0)
+               return TARGET_XFER_EOF;
+             else
+               {
+                 *xfered_len = amt;
+                 return TARGET_XFER_OK;
+               }
+           }
+       }
+    }
+
+  /* Indicate failure to find the requested memory block.  */
+  return TARGET_XFER_E_IO;
+}
+
 VEC(mem_range_s) *
 section_table_available_memory (VEC(mem_range_s) *memory,
                                CORE_ADDR memaddr, ULONGEST len,
This page took 0.026977 seconds and 4 git commands to generate.