* elfxx-mips.c (_bfd_mips_elf_merge_private_bfd_data): Improve
[deliverable/binutils-gdb.git] / bfd / libnlm.h
index 53199bc1f1d5f664c346bb9f057d99b0398c4548..314a21fe61bf28bfd0c8447c4cf62dff9e5fe533 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end data structures for NLM (NetWare Loadable Modules) files.
-   Copyright (C) 1993 Free Software Foundation, Inc.
+   Copyright 1993, 1994, 2001, 2002 Free Software Foundation, Inc.
    Written by Cygnus Support.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -16,7 +16,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #ifndef _LIBNLM_H_
 #define _LIBNLM_H_ 1
@@ -52,32 +52,33 @@ typedef struct
   struct nlm_relent *relocs;
 } nlmNAME(symbol_type);
 
-extern boolean nlm_mkobject PARAMS ((bfd *));
-extern boolean nlm_set_arch_mach PARAMS ((bfd *, enum bfd_architecture,
-                                         unsigned long));
+extern bfd_boolean nlm_mkobject
+  PARAMS ((bfd *));
+extern bfd_boolean nlm_set_arch_mach
+  PARAMS ((bfd *, enum bfd_architecture, unsigned long));
 
 extern void nlmNAME(get_symbol_info)
-     PARAMS ((bfd *, asymbol *, symbol_info *));
-extern unsigned int nlmNAME(get_symtab_upper_bound)
-     PARAMS ((bfd *));
-extern unsigned int nlmNAME(get_symtab)
-     PARAMS ((bfd *, asymbol **));
+  PARAMS ((bfd *, asymbol *, symbol_info *));
+extern long nlmNAME(get_symtab_upper_bound)
+  PARAMS ((bfd *));
+extern long nlmNAME(get_symtab)
+  PARAMS ((bfd *, asymbol **));
 extern asymbol *nlmNAME(make_empty_symbol)
-     PARAMS ((bfd *));
+  PARAMS ((bfd *));
 extern void nlmNAME(print_symbol)
-     PARAMS ((bfd *, PTR, asymbol *, bfd_print_symbol_type));
-extern unsigned int nlmNAME(get_reloc_upper_bound)
-     PARAMS ((bfd *, asection *));
-extern unsigned int nlmNAME(canonicalize_reloc)
-     PARAMS ((bfd *, asection *, arelent **, asymbol **));
-extern bfd_target *nlmNAME(object_p)
-     PARAMS ((bfd *));
-extern boolean nlmNAME(set_arch_mach)
-     PARAMS ((bfd *, enum bfd_architecture, unsigned long));
-extern boolean nlmNAME(set_section_contents)
-     PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type));
-extern boolean nlmNAME(write_object_contents)
-     PARAMS ((bfd *));
+  PARAMS ((bfd *, PTR, asymbol *, bfd_print_symbol_type));
+extern long nlmNAME(get_reloc_upper_bound)
+  PARAMS ((bfd *, asection *));
+extern long nlmNAME(canonicalize_reloc)
+  PARAMS ((bfd *, asection *, arelent **, asymbol **));
+extern const bfd_target *nlmNAME(object_p)
+  PARAMS ((bfd *));
+extern bfd_boolean nlmNAME(set_arch_mach)
+  PARAMS ((bfd *, enum bfd_architecture, unsigned long));
+extern bfd_boolean nlmNAME(set_section_contents)
+  PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type));
+extern bfd_boolean nlmNAME(write_object_contents)
+  PARAMS ((bfd *));
 
 /* Some private data is stashed away for future use using the tdata pointer
    in the bfd structure.  */
@@ -91,6 +92,7 @@ struct nlm_obj_tdata
   Nlm_Internal_Copyright_Header        nlm_copyright_hdr[1];
   Nlm_Internal_Extended_Header nlm_extended_hdr[1];
   Nlm_Internal_Custom_Header   nlm_custom_hdr[1];
+  Nlm_Internal_Cygnus_Ext_Header nlm_cygnus_ext_hdr[1];
   /* BFD NLM symbols.  */
   nlmNAME(symbol_type)         *nlm_symbols;
   /* Lowest text and data VMA values.  */
@@ -99,6 +101,20 @@ struct nlm_obj_tdata
   /* Caches for data read from object file.  */
   arelent *                    nlm_reloc_fixups;
   asection **                  nlm_reloc_fixup_secs;
+  /* Backend specific information.  This should probably be a pointer,
+     but that would require yet another entry point to initialize the
+     structure.  */
+  union
+    {
+      struct   /* Alpha backend information.  */
+       {
+         bfd_vma gp;                   /* GP value.  */
+         bfd_vma lita_address;         /* .lita section address.  */
+         bfd_size_type lita_size;      /* .lita section size.  */
+       }
+      alpha_backend_data;
+    }
+  backend_data;
 };
 
 #define nlm_tdata(bfd)                 ((bfd) -> tdata.nlm_obj_data)
@@ -108,6 +124,7 @@ struct nlm_obj_tdata
 #define nlm_copyright_header(bfd)      (nlm_tdata(bfd) -> nlm_copyright_hdr)
 #define nlm_extended_header(bfd)       (nlm_tdata(bfd) -> nlm_extended_hdr)
 #define nlm_custom_header(bfd)         (nlm_tdata(bfd) -> nlm_custom_hdr)
+#define nlm_cygnus_ext_header(bfd)     (nlm_tdata(bfd) -> nlm_cygnus_ext_hdr)
 #define nlm_get_symbols(bfd)           (nlm_tdata(bfd) -> nlm_symbols)
 #define nlm_set_symbols(bfd, p)                (nlm_tdata(bfd) -> nlm_symbols = (p))
 #define nlm_set_text_low(bfd, i)       (nlm_tdata(bfd) -> nlm_text_low = (i))
@@ -117,14 +134,48 @@ struct nlm_obj_tdata
 #define nlm_relocation_fixups(bfd)     (nlm_tdata(bfd) -> nlm_reloc_fixups)
 #define nlm_relocation_fixup_secs(bfd) (nlm_tdata(bfd)->nlm_reloc_fixup_secs)
 
+#define nlm_alpha_backend_data(bfd) \
+  (&nlm_tdata (bfd)->backend_data.alpha_backend_data)
+
+/* This is used when writing out the external relocs. */
+
+struct reloc_and_sec
+{
+  arelent *rel;
+  asection *sec;
+};
+
 /* We store some function pointer in the backend structure.  This lets
    different NLM targets share most of the same code, while providing
    slightly different code where necessary.  */
 
 struct nlm_backend_data
 {
-  /* Machine architecture.  */
+  /* Signature for this backend.  */
+  char signature[NLM_SIGNATURE_SIZE];
+  /* Size of the fixed header.  */
+  bfd_size_type fixed_header_size;
+  /* Size of optional prefix for this backend.  Some backend may
+     require this to be a function, but so far a constant is OK.  This
+     is for a prefix which precedes the standard NLM fixed header.  */
+  bfd_size_type optional_prefix_size;
+  /* Architecture.  */
   enum bfd_architecture arch;
+  /* Machine.  */
+  unsigned int mach;
+  /* Some NLM formats do not use the uninitialized data section, so
+     all uninitialized data must be put into the regular data section
+     instead.  */
+  bfd_boolean no_uninitialized_data;
+  /* Some NLM formats have a prefix on the file.  If this function is
+     not NULL, it will be called by nlm_object_p.  It should return
+     TRUE if this file could match this format, and it should leave
+     the BFD such that a bfd_bread will pick up the fixed header.  */
+  bfd_boolean (*nlm_backend_object_p) PARAMS ((bfd *));
+  /* Write out the prefix.  This function may be NULL.  This must
+     write out the same number of bytes as is in the field
+     optional_prefix_size.  */
+  bfd_boolean (*nlm_write_prefix) PARAMS ((bfd *));
   /* Read a relocation fixup from abfd.  The reloc information is
      machine specific.  The second argument is the symbol if this is
      an import, or NULL if this is a reloc fixup.  This function
@@ -132,27 +183,73 @@ struct nlm_backend_data
      belongs in, and the fourth argument to the reloc itself; it does
      not need to fill in the sym_ptr_ptr field for a reloc against an
      import symbol.  */
-  boolean (*nlm_read_reloc) PARAMS ((bfd *, nlmNAME(symbol_type) *,
-                                    asection **, arelent *));
-  /* Write a relocation fixup to abfd.  */
-  boolean (*nlm_write_reloc) PARAMS ((bfd *, asection *, arelent *));
+  bfd_boolean (*nlm_read_reloc)
+    PARAMS ((bfd *, nlmNAME(symbol_type) *, asection **, arelent *));
   /* To make objcopy to an i386 NLM work, the i386 backend needs a
      chance to work over the relocs.  This is a bit icky.  */
-  boolean (*nlm_mangle_relocs) PARAMS ((bfd *, asection *, PTR data,
-                                       bfd_vma offset,
-                                       bfd_size_type count));
+  bfd_boolean (*nlm_mangle_relocs)
+    PARAMS ((bfd *, asection *, PTR data, bfd_vma offset, bfd_size_type count));
+  /* Read an import record from abfd.  It would be nice if this
+     were in a machine-dependent format, but it doesn't seem to be. */
+  bfd_boolean (*nlm_read_import) PARAMS ((bfd *, nlmNAME(symbol_type) *));
+  /* Write an import record to abfd. */
+  bfd_boolean (*nlm_write_import) PARAMS ((bfd *, asection *, arelent *));
+  /* Set the section for a public symbol.  This may be NULL, in which
+     case a default method will be used.  */
+  bfd_boolean (*nlm_set_public_section)
+    PARAMS ((bfd *, nlmNAME(symbol_type) *));
+  /* Get the offset to write out for a public symbol.  This may be
+     NULL, in which case a default method will be used.  */
+  bfd_vma (*nlm_get_public_offset) PARAMS ((bfd *, asymbol *));
+  /* Swap the fixed header in and out */
+  void (*nlm_swap_fhdr_in)
+    PARAMS ((bfd *, PTR, Nlm_Internal_Fixed_Header *));
+  void (*nlm_swap_fhdr_out)
+    PARAMS ((bfd *, struct nlm_internal_fixed_header *, PTR));
+  /* Write out an external reference.  */
+  bfd_boolean (*nlm_write_external)
+    PARAMS ((bfd *, bfd_size_type, asymbol *, struct reloc_and_sec *));
+  bfd_boolean (*nlm_write_export) PARAMS ((bfd *, asymbol *, bfd_vma));
 };
 
 #define nlm_backend(bfd) \
   ((struct nlm_backend_data *)((bfd) -> xvec -> backend_data))
+#define nlm_signature(bfd) \
+  (nlm_backend(bfd) -> signature)
+#define nlm_fixed_header_size(bfd) \
+  (nlm_backend(bfd) -> fixed_header_size)
+#define nlm_optional_prefix_size(bfd) \
+  (nlm_backend(bfd) -> optional_prefix_size)
 #define nlm_architecture(bfd) \
-  (nlm_backend(bfd) ? nlm_backend(bfd) -> arch : bfd_arch_unknown)
+  (nlm_backend(bfd) -> arch)
+#define nlm_machine(bfd) \
+  (nlm_backend(bfd) -> mach)
+#define nlm_no_uninitialized_data(bfd) \
+  (nlm_backend(bfd) -> no_uninitialized_data)
+#define nlm_backend_object_p_func(bfd) \
+  (nlm_backend(bfd) -> nlm_backend_object_p)
+#define nlm_write_prefix_func(bfd) \
+  (nlm_backend(bfd) -> nlm_write_prefix)
 #define nlm_read_reloc_func(bfd) \
-  (nlm_backend(bfd) ? nlm_backend(bfd) -> nlm_read_reloc : 0)
-#define nlm_write_reloc_func(bfd) \
-  (nlm_backend(bfd) ? nlm_backend(bfd) -> nlm_write_reloc : 0)
+  (nlm_backend(bfd) -> nlm_read_reloc)
 #define nlm_mangle_relocs_func(bfd) \
-  (nlm_backend(bfd) ? nlm_backend(bfd) -> nlm_mangle_relocs : 0)
+  (nlm_backend(bfd) -> nlm_mangle_relocs)
+#define nlm_read_import_func(bfd) \
+  (nlm_backend(bfd) -> nlm_read_import)
+#define nlm_write_import_func(bfd) \
+  (nlm_backend(bfd) -> nlm_write_import)
+#define nlm_set_public_section_func(bfd) \
+  (nlm_backend(bfd) -> nlm_set_public_section)
+#define nlm_get_public_offset_func(bfd) \
+  (nlm_backend(bfd) -> nlm_get_public_offset)
+#define nlm_swap_fixed_header_in_func(bfd) \
+  (nlm_backend(bfd) -> nlm_swap_fhdr_in)
+#define nlm_swap_fixed_header_out_func(bfd) \
+  (nlm_backend(bfd) -> nlm_swap_fhdr_out)
+#define nlm_write_external_func(bfd) \
+  (nlm_backend(bfd) -> nlm_write_external)
+#define nlm_write_export_func(bfd) \
+  (nlm_backend(bfd) -> nlm_write_export)
 
 /* The NLM code, data, and uninitialized sections have no names defined
    in the NLM, but bfd wants to give them names, so use the traditional
This page took 0.027847 seconds and 4 git commands to generate.