* remote-es.c (es1800_child_ops): Don't declare it static.
[deliverable/binutils-gdb.git] / bfd / libelf.h
index 1f0f1a5078f2ce6825a18a5ec4050c243e0bfd4d..b0143a1b232931b39d592e0ae94039e23b656966 100644 (file)
@@ -42,78 +42,133 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define ElfNAME(X)     NAME(Elf,X)
 #define elfNAME(X)     NAME(elf,X)
 
-typedef struct
-{
-  asymbol symbol;
-  Elf_Internal_Sym internal_elf_sym;
-  /* these are used for the generation of .stabX symbols (?) */
-  short desc;
-  unsigned char type;
-  char other;
-  union
-    {
-      unsigned int hppa_arg_reloc;
-      PTR any;
-    }
-  tc_data;
-  Elf32_External_Sym native_elf_sym;
-} elf32_symbol_type;
+/* Information held for an ELF symbol.  The first field is the
+   corresponding asymbol.  Every symbol is an ELF file is actually a
+   pointer to this structure, although it is often handled as a
+   pointer to an asymbol.  */
 
 typedef struct
 {
+  /* The BFD symbol.  */
   asymbol symbol;
+  /* ELF symbol information.  */
   Elf_Internal_Sym internal_elf_sym;
-  /* these are used for the generation of .stabX symbols (?) */
-  short desc;
-  unsigned char type;
-  char other;
+  /* Backend specific information.  */
   union
     {
       unsigned int hppa_arg_reloc;
+      PTR mips_extr;
       PTR any;
     }
   tc_data;
-  Elf64_External_Sym native_elf_sym;
-} elf64_symbol_type;
+} elf_symbol_type;
+
+/* Constant information held for an ELF backend.  */
 
 struct elf_backend_data
 {
+  /* Whether the backend uses REL or RELA relocations.  FIXME: some
+     ELF backends use both.  When we need to support one, this whole
+     approach will need to be changed.  */
   int use_rela_p;
+
+  /* Whether this backend is 64 bits or not.  FIXME: Who cares?  */
   int elf_64_p;
+
+  /* The architecture for this backend.  */
   enum bfd_architecture arch;
+
+  /* The ELF machine code (EM_xxxx) for this backend.  */
+  int elf_machine_code;
+
+  /* The maximum page size for this backend.  */
+  bfd_vma maxpagesize;
+
+  /* A function to translate an ELF RELA relocation to a BFD arelent
+     structure.  */
   void (*elf_info_to_howto) PARAMS ((bfd *, arelent *,
                                     Elf_Internal_Rela *));
+
+  /* A function to translate an ELF REL relocation to a BFD arelent
+     structure.  */
   void (*elf_info_to_howto_rel) PARAMS ((bfd *, arelent *,
                                         Elf_Internal_Rel *));
-  bfd_vma maxpagesize;
-  void (*write_relocs) PARAMS ((bfd *, asection *, PTR));
-
-  /* @@ I really don't think this should be here.  I don't know what
-     global_sym is supposed to be used for, but I doubt it's something
-     that would be considered global, e.g., if you've got a program
-     reading and writing many BFDs.  My hunch is that it's specific to
-     the output BFD.  If not, put a comment here explaining why.  */
-  /* @@ Was pointer to elfNAME(symbol_type).  This makes it size-
-     independent.  */
-  PTR global_sym;
+
+  /* A function to determine whether a symbol is global when
+     partitioning the symbol table into local and global symbols.
+     This should be NULL for most targets, in which case the correct
+     thing will be done.  MIPS ELF, at least on the Irix 5, has
+     special requirements.  */
+  boolean (*elf_backend_sym_is_global) PARAMS ((bfd *, asymbol *));
+
+  /* The remaining functions are hooks which are called only if they
+     are not NULL.  */
+
+  /* A function to permit a backend specific check on whether a
+     particular BFD format is relevant for an object file, and to
+     permit the backend to set any global information it wishes.  When
+     this is called elf_elfheader is set, but anything else should be
+     used with caution.  If this returns false, the check_format
+     routine will return a bfd_error_wrong_format error.  */
+  boolean (*elf_backend_object_p) PARAMS ((bfd *));
+
+  /* A function to do additional symbol processing when reading the
+     ELF symbol table.  This is where any processor-specific special
+     section indices are handled.  */
+  void (*elf_backend_symbol_processing) PARAMS ((bfd *, asymbol *));
+
+  /* A function to do additional symbol processing after reading the
+     entire ELF symbol table.  */
+  boolean (*elf_backend_symbol_table_processing) PARAMS ((bfd *,
+                                                         elf_symbol_type *,
+                                                         int));
+
+  /* A function to do additional processing on the ELF section header
+     just before writing it out.  This is used to set the flags and
+     type fields for some sections, or to actually write out data for
+     unusual sections.  */
+  boolean (*elf_backend_section_processing) PARAMS ((bfd *,
+                                                    Elf32_Internal_Shdr *));
+
+  /* A function to handle unusual section types when creating BFD
+     sections from ELF sections.  */
+  boolean (*elf_backend_section_from_shdr) PARAMS ((bfd *,
+                                                   Elf32_Internal_Shdr *,
+                                                   char *));
+
+  /* A function to set up the ELF section header for a BFD section in
+     preparation for writing it out.  This is where the flags and type
+     fields are set for unusual sections.  */
+  boolean (*elf_backend_fake_sections) PARAMS ((bfd *, Elf32_Internal_Shdr *,
+                                               asection *));
+
+  /* A function to get the ELF section index for a BFD section.  If
+     this returns true, the section was found.  If it is a normal ELF
+     section, *RETVAL should be left unchanged.  If it is not a normal
+     ELF section *RETVAL should be set to the SHN_xxxx index.  */
+  boolean (*elf_backend_section_from_bfd_section)
+    PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *, int *retval));
+
+  /* A function to do any final processing needed for the ELF file
+     before writing it out.  */
+  void (*elf_backend_final_write_processing) PARAMS ((bfd *));
+
+  /* The swapping table to use when dealing with ECOFF information.
+     Used for the MIPS ELF .mdebug section.  */
+  const struct ecoff_debug_swap *elf_backend_ecoff_debug_swap;
 };
 
-struct bfd_elf_arch_map {
-  enum bfd_architecture bfd_arch;
-  int elf_arch;
+struct elf_sym_extra
+{
+  int elf_sym_num;             /* sym# after locals/globals are reordered */
 };
 
-extern const struct bfd_elf_arch_map bfd_elf_arch_map[];
-extern const int bfd_elf_arch_map_size;
+typedef struct elf_sym_extra Elf_Sym_Extra;
 
 struct bfd_elf_section_data {
   Elf_Internal_Shdr this_hdr;
   Elf_Internal_Shdr rel_hdr;
   int this_idx, rel_idx;
-#if 0
-  Elf_Internal_Shdr str_hdr;
-  int str_idx;
-#endif
 };
 #define elf_section_data(sec)  ((struct bfd_elf_section_data*)sec->used_by_bfd)
 #define shdr_name(abfd,shdr)   (elf_shstrtab (abfd)->tab + (shdr)->sh_name)
@@ -139,11 +194,11 @@ struct elf_obj_tdata
   struct strtab *strtab_ptr;
   int num_locals;
   int num_globals;
-  int *symtab_map;
-  PTR raw_syms;                        /* Elf_External_Sym* */
   Elf_Internal_Sym *internal_syms;
-  PTR symbols;                 /* elf_symbol_type */
-/*  struct strtab *shstrtab;*/
+  elf_symbol_type *symbols;    /* elf_symbol_type */
+  Elf_Sym_Extra *sym_extra;
+  asymbol **section_syms;      /* STT_SECTION symbols for each section */
+  int num_section_syms;                /* number of section_syms allocated */
   Elf_Internal_Shdr symtab_hdr;
   Elf_Internal_Shdr shstrtab_hdr;
   Elf_Internal_Shdr strtab_hdr;
@@ -151,6 +206,8 @@ struct elf_obj_tdata
   file_ptr next_file_pos;
   void *prstatus;              /* The raw /proc prstatus structure */
   void *prpsinfo;              /* The raw /proc prpsinfo structure */
+  bfd_vma gp;                  /* The gp value (MIPS only, for now) */
+  int gp_size;                 /* The gp size (MIPS only, for now) */
 };
 
 #define elf_tdata(bfd)         ((bfd) -> tdata.elf_obj_data)
@@ -160,12 +217,15 @@ struct elf_obj_tdata
 #define elf_onesymtab(bfd)     (elf_tdata(bfd) -> symtab_section)
 #define elf_num_locals(bfd)    (elf_tdata(bfd) -> num_locals)
 #define elf_num_globals(bfd)   (elf_tdata(bfd) -> num_globals)
-#define elf_symtab_map(bfd)    (elf_tdata(bfd) -> symtab_map)
+#define elf_sym_extra(bfd)     (elf_tdata(bfd) -> sym_extra)
+#define elf_section_syms(bfd)  (elf_tdata(bfd) -> section_syms)
+#define elf_num_section_syms(bfd) (elf_tdata(bfd) -> num_section_syms)
 #define core_prpsinfo(bfd)     (elf_tdata(bfd) -> prpsinfo)
 #define core_prstatus(bfd)     (elf_tdata(bfd) -> prstatus)
-#define obj_symbols(bfd)       ((elf_symbol_type*)(elf_tdata(bfd) -> symbols))
-#define obj_raw_syms(bfd)      ((Elf_External_Sym*)(elf_tdata(bfd) -> raw_syms))
+#define obj_symbols(bfd)       (elf_tdata(bfd) -> symbols)
 #define obj_internal_syms(bfd) (elf_tdata(bfd) -> internal_syms)
+#define elf_gp(bfd)            (elf_tdata(bfd) -> gp)
+#define elf_gp_size(bfd)       (elf_tdata(bfd) -> gp_size)
 
 extern char * elf_string_from_elf_section PARAMS ((bfd *, unsigned, unsigned));
 extern char * elf_get_str_section PARAMS ((bfd *, unsigned));
@@ -181,8 +241,11 @@ extern bfd_reloc_status_type bfd_elf_generic_reloc PARAMS ((bfd *,
                                                            asymbol *,
                                                            PTR,
                                                            asection *,
-                                                           bfd *));
+                                                           bfd *,
+                                                           char **));
 extern boolean bfd_elf_mkobject PARAMS ((bfd *));
+extern Elf_Internal_Shdr *bfd_elf_find_section PARAMS ((bfd *, char *));
+
 extern boolean bfd_elf32_write_object_contents PARAMS ((bfd *));
 extern boolean bfd_elf64_write_object_contents PARAMS ((bfd *));
 
This page took 0.024814 seconds and 4 git commands to generate.