From: Roland McGrath Date: Wed, 21 May 2003 00:56:00 +0000 (+0000) Subject: 2003-05-19 Roland McGrath X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3333a7c3394cdd592086c2358d52d3e4ae16b9f1;p=binutils-gdb.git 2003-05-19 Roland McGrath * elf.c (bfd_elf_bfd_from_remote_memory): New function. * bfd-in.h: Declare it. * elfcode.h (NAME(_bfd_elf,bfd_from_remote_memory)): New function. * elf-bfd.h (struct elf_backend_data): New function pointer member elf_backend_bfd_from_remote_memory. (_bfd_elf32_bfd_from_remote_memory, _bfd_elf64_bfd_from_remote_memory): Declare them. * elfxx-target.h (elf_backend_bfd_from_remote_memory): New macro. (elfNN_bed): Add that to the initializer. 2003-05-15 Roland McGrath * elf.c (elfcore_grok_note): Grok NT_AUXV note, make ".auxv" section. --- diff --git a/bfd/elf.c b/bfd/elf.c index fa4416d0b60..5e72eb05bf5 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -6884,6 +6884,20 @@ elfcore_grok_note (abfd, note) #else return TRUE; #endif + + case NT_AUXV: + { + asection *sect = bfd_make_section (abfd, ".auxv"); + + if (sect == NULL) + return FALSE; + sect->_raw_size = note->descsz; + sect->filepos = note->descpos; + sect->flags = SEC_HAS_CONTENTS; + sect->alignment_power = 1 + bfd_get_arch_size (abfd) / 32; + + return TRUE; + } } } @@ -7535,3 +7549,27 @@ _bfd_elf_section_offset (abfd, info, sec, offset) return offset; } } + +/* 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 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 (templ, ehdr_vma, loadbasep, target_read_memory) + bfd *templ; + bfd_vma ehdr_vma; + bfd_vma *loadbasep; + int (*target_read_memory) PARAMS ((bfd_vma vma, char *myaddr, int len)); +{ + return (*get_elf_backend_data (templ)->elf_backend_bfd_from_remote_memory) + (templ, ehdr_vma, loadbasep, target_read_memory); +}