From 98d8431c7d2f12be9f39abae99af3f8e8efc524d Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Mon, 29 Nov 1999 20:33:38 +0000 Subject: [PATCH] * elf.c (bfd_get_elf_phdrs, bfd_get_elf_phdr_upper_bound): New functions. * bfd-in2.h (bfd_get_elf_phdrs, bfd_get_elf_phdr_upper_bound): New declarations. --- bfd/ChangeLog | 7 +++++++ bfd/bfd-in2.h | 16 ++++++++++++++++ bfd/elf.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2a2ff7b2303..ec7e767a8d0 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +1999-11-29 Jim Blandy + + * elf.c (bfd_get_elf_phdrs, bfd_get_elf_phdr_upper_bound): New + functions. + * bfd-in2.h (bfd_get_elf_phdrs, bfd_get_elf_phdr_upper_bound): New + declarations. + 1999-11-27 Michael Meissner * reloc.c (BFD_RELOC_ALPHA_USER_LITERAL): New relocation for diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 9fe0cfbb576..50539b124bc 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -3091,6 +3091,22 @@ bfd_set_format PARAMS ((bfd *abfd, bfd_format format)); CONST char * bfd_format_string PARAMS ((bfd_format format)); + +/* Return an upper bound on the number of bytes required to store a + copy of ABFD's program header table entries. Return -1 if an error + occurs; bfd_get_error will return an appropriate code. */ +extern long bfd_get_elf_phdr_upper_bound PARAMS ((bfd *abfd)); + +/* Copy ABFD's program header table entries to *PHDRS. The entries + will be stored as an array of Elf_Internal_Phdr structures, as + defined in include/elf/internal.h. To find out how large the + buffer needs to be, call bfd_get_elf_phdr_upper_bound. + + Return the number of program header table entries read, or -1 if an + error occurs; bfd_get_error will return an appropriate code. */ +extern int bfd_get_elf_phdrs PARAMS ((bfd *abfd, void *phdrs)); + + #ifdef __cplusplus } #endif diff --git a/bfd/elf.c b/bfd/elf.c index d957476d79b..4dc87af7ea5 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -5359,3 +5359,51 @@ _bfd_elfcore_section_from_phdr (abfd, phdr, sec_num) return true; } + + +/* Providing external access to the ELF program header table. */ + +/* Return an upper bound on the number of bytes required to store a + copy of ABFD's program header table entries. Return -1 if an error + occurs; bfd_get_error will return an appropriate code. */ +long +bfd_get_elf_phdr_upper_bound (abfd) + bfd *abfd; +{ + if (abfd->xvec->flavour != bfd_target_elf_flavour) + { + bfd_set_error (bfd_error_wrong_format); + return -1; + } + + return (elf_elfheader (abfd)->e_phnum + * sizeof (Elf_Internal_Phdr)); +} + + +/* Copy ABFD's program header table entries to *PHDRS. The entries + will be stored as an array of Elf_Internal_Phdr structures, as + defined in include/elf/internal.h. To find out how large the + buffer needs to be, call bfd_get_elf_phdr_upper_bound. + + Return the number of program header table entries read, or -1 if an + error occurs; bfd_get_error will return an appropriate code. */ +int +bfd_get_elf_phdrs (abfd, phdrs) + bfd *abfd; + void *phdrs; +{ + int num_phdrs; + + if (abfd->xvec->flavour != bfd_target_elf_flavour) + { + bfd_set_error (bfd_error_wrong_format); + return -1; + } + + num_phdrs = elf_elfheader (abfd)->e_phnum; + memcpy (phdrs, elf_tdata (abfd)->phdr, + num_phdrs * sizeof (Elf_Internal_Phdr)); + + return num_phdrs; +} -- 2.30.2