summaryrefslogtreecommitdiff
path: root/bfd/opncls.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2023-05-03 12:47:15 +0930
committerAlan Modra <amodra@gmail.com>2023-05-03 14:53:28 +0930
commit37cfe371c4f2bb7aba2a684ed91749d1288ca187 (patch)
tree5078b1f8b46595dd074bc1d53f8626e481e9e24a /bfd/opncls.c
parentd659ef954399b0b1693d1cd02dbac222100b9aa2 (diff)
downloadbinutils-gdb-37cfe371c4f2bb7aba2a684ed91749d1288ca187.tar.gz
Move bfd_elf_bfd_from_remote_memory to opncls.c
bfd_elf_bfd_from_remote_memory is just a wrapper, and the function could be implemented for other formats. Move it to opncls.c because it acts a little like some of the other bfd_open* routines. Also give it the usual FUNCTION etc. comment so prototypes and docs are handled automatically. * elf.c (bfd_elf_bfd_from_remote_memory): Move to.. * opncls.c: ..here, add FUNCTION comment. * bfd-in.h (bfd_elf_bfd_from_remote_memory): Delete prototype. * bfd-in2.h: Regenerate.
Diffstat (limited to 'bfd/opncls.c')
-rw-r--r--bfd/opncls.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/bfd/opncls.c b/bfd/opncls.c
index eabea414467..602dc80a6c4 100644
--- a/bfd/opncls.c
+++ b/bfd/opncls.c
@@ -760,6 +760,51 @@ bfd_openw (const char *filename, const char *target)
return nbfd;
}
+/*
+FUNCTION
+ bfd_elf_bfd_from_remote_memory
+
+SYNOPSIS
+ bfd *bfd_elf_bfd_from_remote_memory
+ (bfd *templ, bfd_vma ehdr_vma, bfd_size_type size, bfd_vma *loadbasep,
+ int (*target_read_memory)
+ (bfd_vma vma, bfd_byte *myaddr, bfd_size_type len));
+
+DESCRIPTION
+ Create a new BFD as if by bfd_openr. Rather than opening a
+ file, reconstruct an ELF file by reading the segments out of
+ remote memory based on the ELF file header at EHDR_VMA and the
+ ELF program headers it points to. If non-zero, SIZE is the
+ known extent of the object. If not null, *LOADBASEP is filled
+ in with the difference between the VMAs from which the
+ segments were read, and the VMAs the file headers (and hence
+ BFD's idea of each section's VMA) put them at.
+
+ The function TARGET_READ_MEMORY is called to copy LEN bytes
+ from the remote memory at target address VMA into the local
+ buffer at MYADDR; it should return zero on success or an
+ errno code on failure. TEMPL must be a BFD for an ELF
+ target with the word size and byte order found in the remote
+ memory.
+*/
+
+bfd *
+bfd_elf_bfd_from_remote_memory
+ (bfd *templ,
+ bfd_vma ehdr_vma,
+ bfd_size_type size,
+ bfd_vma *loadbasep,
+ int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
+{
+ if (bfd_get_flavour (templ) != bfd_target_elf_flavour)
+ {
+ bfd_set_error (bfd_error_invalid_operation);
+ return NULL;
+ }
+ return (*get_elf_backend_data (templ)->elf_backend_bfd_from_remote_memory)
+ (templ, ehdr_vma, size, loadbasep, target_read_memory);
+}
+
static inline void
_maybe_make_executable (bfd * abfd)
{