* elf.c (bfd_get_elf_phdrs, bfd_get_elf_phdr_upper_bound): New
authorJim Blandy <jimb@codesourcery.com>
Mon, 29 Nov 1999 20:33:38 +0000 (20:33 +0000)
committerJim Blandy <jimb@codesourcery.com>
Mon, 29 Nov 1999 20:33:38 +0000 (20:33 +0000)
functions.
* bfd-in2.h (bfd_get_elf_phdrs, bfd_get_elf_phdr_upper_bound): New
declarations.

bfd/ChangeLog
bfd/bfd-in2.h
bfd/elf.c

index 2a2ff7b2303a02c4cd5f6e0d897241447a7e48e0..ec7e767a8d08ceac16c5f368bac5a43697ce1296 100644 (file)
@@ -1,3 +1,10 @@
+1999-11-29  Jim Blandy  <jimb@cygnus.com>
+
+       * 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  <meissner@cygnus.com>
 
        * reloc.c (BFD_RELOC_ALPHA_USER_LITERAL): New relocation for
index 9fe0cfbb576ea1da1accfd997420f9b389b23891..50539b124bc81ab866f1dae8961577550287e97b 100644 (file)
@@ -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
index d957476d79baa0c7b9613eaccaeb2d7525643cc8..4dc87af7ea57f47e00a7e5c9008c709f7aaf2b1d 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -5359,3 +5359,51 @@ _bfd_elfcore_section_from_phdr (abfd, phdr, sec_num)
   return true;
 }
 
+
+\f
+/* 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;
+}