* libnlm.h (struct nlm_backend_data): New fields
[deliverable/binutils-gdb.git] / bfd / libnlm.h
index 33824b9eba00a779ed18591f73d01b0d8632cb52..22d779d9aae8e3424893b9017a1ebe2c1c5d3df1 100644 (file)
@@ -21,52 +21,63 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #ifndef _LIBNLM_H_
 #define _LIBNLM_H_ 1
 
+#ifdef ARCH_SIZE
+#  define NLM_ARCH_SIZE ARCH_SIZE
+#endif
 #include "nlm/common.h"
 #include "nlm/internal.h"
 #include "nlm/external.h"
 
-/* If size isn't specified as 64 or 32, NAME macro should fail.  */
-#ifndef NAME
-#  if ARCH_SIZE==64
-#    define NAME(x,y) CAT4(x,64,_,y)
-#  endif
-#  if ARCH_SIZE==32
-#    define NAME(x,y) CAT4(x,32,_,y)
-#  endif
-#endif
-
-#define NlmNAME(X)     NAME(Nlm,X)
-#define nlmNAME(X)     NAME(nlm,X)
+/* A reloc for an imported NLM symbol.  Normal relocs are associated
+   with sections, and include a symbol.  These relocs are associated
+   with (undefined) symbols, and include a section.  */
 
-typedef struct
+struct nlm_relent
 {
-  asymbol symbol;
-} nlm32_symbol_type;
+  /* Section of reloc.  */
+  asection *section;
+  /* Reloc info (sym_ptr_ptr field set only when canonicalized).  */
+  arelent reloc;
+};
+
+/* Information we keep for an NLM symbol.  */
 
 typedef struct
 {
+  /* BFD symbol.  */
   asymbol symbol;
-} nlm64_symbol_type;
-
-#define bfd_nlm32_mkobject             bfd_nlm_mkobject
-#define bfd_nlm64_mkobject             bfd_nlm_mkobject
-#define nlm_mkobject                   bfd_nlm_mkobject
-extern boolean bfd_nlm_mkobject PARAMS ((bfd *));
-
-extern void bfd_nlm32_get_symbol_info
-  PARAMS ((bfd *, asymbol *, symbol_info *));
-extern unsigned int bfd_nlm32_get_symtab_upper_bound PARAMS ((bfd *));
-extern unsigned int bfd_nlm64_get_symtab_upper_bound PARAMS ((bfd *));
-extern unsigned int bfd_nlm32_get_symtab PARAMS ((bfd *, asymbol **));
-extern unsigned int bfd_nlm64_get_symtab PARAMS ((bfd *, asymbol **));
-extern asymbol *bfd_nlm32_make_empty_symbol PARAMS ((bfd *));
-extern asymbol *bfd_nlm64_make_empty_symbol PARAMS ((bfd *));
-extern bfd_target *bfd_nlm32_object_p PARAMS ((bfd *));
-extern bfd_target *bfd_nlm64_object_p PARAMS ((bfd *));
-extern boolean bfd_nlm32_set_arch_mach
-  PARAMS ((bfd *, enum bfd_architecture, unsigned long));
-extern boolean bfd_nlm64_set_arch_mach
-  PARAMS ((bfd *, enum bfd_architecture, unsigned long));
+  /* Number of reloc entries for imported symbol.  */
+  bfd_size_type rcnt;
+  /* Array of reloc information for imported symbol.  */
+  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 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 **));
+extern asymbol *nlmNAME(make_empty_symbol)
+     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 *));
 
 /* Some private data is stashed away for future use using the tdata pointer
    in the bfd structure.  */
@@ -74,21 +85,145 @@ extern boolean bfd_nlm64_set_arch_mach
 struct nlm_obj_tdata
 {
   /* Actual data, but ref like ptr */
-  Nlm_Internal_Fixed_Header    nlm_fixed_header[1];
-  Nlm_Internal_Variable_Header nlm_variable_header[1];
-  Nlm_Internal_Version_Header  nlm_version_header[1];
-  Nlm_Internal_Copyright_Header        nlm_copyright_header[1];
-  Nlm_Internal_Extended_Header nlm_extended_header[1];
-  Nlm_Internal_Custom_Header   nlm_custom_header[1];
+  Nlm_Internal_Fixed_Header    nlm_fixed_hdr[1];
+  Nlm_Internal_Variable_Header nlm_variable_hdr[1];
+  Nlm_Internal_Version_Header  nlm_version_hdr[1];
+  Nlm_Internal_Copyright_Header        nlm_copyright_hdr[1];
+  Nlm_Internal_Extended_Header nlm_extended_hdr[1];
+  Nlm_Internal_Custom_Header   nlm_custom_hdr[1];
+  /* BFD NLM symbols.  */
+  nlmNAME(symbol_type)         *nlm_symbols;
+  /* Lowest text and data VMA values.  */
+  bfd_vma                      nlm_text_low;
+  bfd_vma                      nlm_data_low;
+  /* Caches for data read from object file.  */
+  arelent *                    nlm_reloc_fixups;
+  asection **                  nlm_reloc_fixup_secs;
 };
 
 #define nlm_tdata(bfd)                 ((bfd) -> tdata.nlm_obj_data)
-#define nlm_fixed_header(bfd)          (nlm_tdata(bfd) -> nlm_fixed_header)
-#define nlm_variable_header(bfd)       (nlm_tdata(bfd) -> nlm_variable_header)
-#define nlm_version_header(bfd)                (nlm_tdata(bfd) -> nlm_version_header)
-#define nlm_copyright_header(bfd)      (nlm_tdata(bfd) -> nlm_copyright_header)
-#define nlm_extended_header(bfd)       (nlm_tdata(bfd) -> nlm_extended_header)
-#define nlm_custom_header(bfd)         (nlm_tdata(bfd) -> nlm_custom_header)
+#define nlm_fixed_header(bfd)          (nlm_tdata(bfd) -> nlm_fixed_hdr)
+#define nlm_variable_header(bfd)       (nlm_tdata(bfd) -> nlm_variable_hdr)
+#define nlm_version_header(bfd)                (nlm_tdata(bfd) -> nlm_version_hdr)
+#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_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))
+#define nlm_get_text_low(bfd)          (nlm_tdata(bfd) -> nlm_text_low)
+#define nlm_set_data_low(bfd, i)       (nlm_tdata(bfd) -> nlm_data_low = (i))
+#define nlm_get_data_low(bfd)          (nlm_tdata(bfd) -> nlm_data_low)
+#define nlm_relocation_fixups(bfd)     (nlm_tdata(bfd) -> nlm_reloc_fixups)
+#define nlm_relocation_fixup_secs(bfd) (nlm_tdata(bfd)->nlm_reloc_fixup_secs)
+
+/* 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
+{
+  /* 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.  */
+  long mach;
+  /* 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_read will pick up the fixed header.  */
+  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.  */
+  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
+     should set the third argument to the section which the reloc
+     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 *));
+  /* 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));
+  /* 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. */
+  boolean (*nlm_read_import) PARAMS ((bfd *, nlmNAME(symbol_type) *));
+  /* Write an import record to abfd. */
+  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.  */
+  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.  */
+  boolean (*nlm_write_external) PARAMS ((bfd *, bfd_size_type,
+                                        asymbol *,
+                                        struct reloc_and_sec *));
+};
+
+#define nlm_backend(bfd) \
+  ((struct nlm_backend_data *)((bfd) -> xvec -> backend_data))
+#define nlm_signature(bfd) \
+  (nlm_backend(bfd) ? nlm_backend(bfd) -> signature : "")
+#define nlm_fixed_header_size(bfd) \
+  (nlm_backend(bfd) ? nlm_backend(bfd) -> fixed_header_size : 0)
+#define nlm_optional_prefix_size(bfd) \
+  (nlm_backend(bfd) ? nlm_backend(bfd) -> optional_prefix_size : 0)
+#define nlm_architecture(bfd) \
+  (nlm_backend(bfd) ? nlm_backend(bfd) -> arch : bfd_arch_unknown)
+#define nlm_machine(bfd) \
+  (nlm_backend(bfd) ? nlm_backend(bfd) -> mach : 0)
+#define nlm_backend_object_p_func(bfd) \
+  (nlm_backend(bfd) ? nlm_backend(bfd) -> nlm_backend_object_p : 0)
+#define nlm_write_prefix_func(bfd) \
+  (nlm_backend(bfd) ? nlm_backend(bfd) -> nlm_write_prefix : 0)
+#define nlm_read_reloc_func(bfd) \
+  (nlm_backend(bfd) ? nlm_backend(bfd) -> nlm_read_reloc : 0)
+#define nlm_mangle_relocs_func(bfd) \
+  (nlm_backend(bfd) ? nlm_backend(bfd) -> nlm_mangle_relocs : 0)
+#define nlm_read_import_func(bfd) \
+  (nlm_backend(bfd) ? nlm_backend(bfd) -> nlm_read_import : 0)
+#define nlm_write_import_func(bfd) \
+  (nlm_backend(bfd) ? nlm_backend(bfd) -> nlm_write_import : 0)
+#define nlm_set_public_section_func(bfd) \
+  (nlm_backend(bfd) ? nlm_backend(bfd) -> nlm_set_public_section : 0)
+#define nlm_get_public_offset_func(bfd) \
+  (nlm_backend(bfd) ? nlm_backend(bfd) -> nlm_get_public_offset : 0)
+#define nlm_swap_fixed_header_in_func(bfd) \
+  (nlm_backend(bfd) ? nlm_backend(bfd) -> nlm_swap_fhdr_in : 0)
+#define nlm_swap_fixed_header_out_func(bfd) \
+  (nlm_backend(bfd) ? nlm_backend(bfd) -> nlm_swap_fhdr_out : 0)
+#define nlm_write_external_func(bfd) \
+  (nlm_backend(bfd) ? nlm_backend(bfd) -> nlm_write_external : 0)
 
 /* 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.025009 seconds and 4 git commands to generate.