From 95469b0290dd0db99e9c0d294ff46c2ba488c09f Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 9 Nov 1993 16:33:28 +0000 Subject: [PATCH] * libelf.h: Added some comments. (struct elf_backend_data): Added elf_backend_ecoff_debug_swap field. Removed unused write_relocs field. * elf32-target.h: Adjusted elf_backend_data initialization accordingly. * elf64-target.h: Corrected elf_backend_data initialization to fill in all fields and to set elf_64_p to 1. --- bfd/ChangeLog | 10 +++++++ bfd/elf32-target.h | 7 +++-- bfd/elf64-target.h | 39 +++++++++++++++++++----- bfd/libelf.h | 75 +++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 115 insertions(+), 16 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d0a7f59f4b..0cc7410637 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +Tue Nov 9 11:26:05 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * libelf.h: Added some comments. + (struct elf_backend_data): Added elf_backend_ecoff_debug_swap + field. Removed unused write_relocs field. + * elf32-target.h: Adjusted elf_backend_data initialization + accordingly. + * elf64-target.h: Corrected elf_backend_data initialization to + fill in all fields and to set elf_64_p to 1. + Mon Nov 8 18:13:14 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) * elfcode.h (bfd_section_from_shdr): Remove duplicate assignment diff --git a/bfd/elf32-target.h b/bfd/elf32-target.h index 8d0076bfae..9b1c832e5c 100644 --- a/bfd/elf32-target.h +++ b/bfd/elf32-target.h @@ -79,6 +79,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef elf_backend_section_from_bfd_section #define elf_backend_section_from_bfd_section 0 /* elf_backend_section_from_bfd_section */ #endif +#ifndef elf_backend_ecoff_debug_swap +#define elf_backend_ecoff_debug_swap 0 /* elf_backed_ecoff_debug_swap */ +#endif static CONST struct elf_backend_data elf32_bed = { @@ -89,16 +92,16 @@ static CONST struct elf_backend_data elf32_bed = #endif 0, /* elf_64_p */ ELF_ARCH, /* arch */ + ELF_MAXPAGESIZE, /* maxpagesize */ elf_info_to_howto, /* elf_info_to_howto */ elf_info_to_howto_rel, /* elf_info_to_howto_rel */ - ELF_MAXPAGESIZE, /* maxpagesize */ - bfd_elf32__write_relocs, /* write_relocs */ elf_backend_symbol_processing, /* elf_backend_symbol_processing */ elf_backend_symbol_table_processing, /* elf_backend_symbol_table_processing */ elf_backend_section_processing, /* elf_backend_section_processing */ elf_backend_section_from_shdr, /* elf_backend_section_from_shdr */ elf_backend_fake_sections, /* elf_backend_fake_sections */ elf_backend_section_from_bfd_section, /* elf_backend_section_from_bfd_section */ + elf_backend_ecoff_debug_swap /* elf_backend_ecoff_debug_swap */ }; #ifdef TARGET_BIG_SYM diff --git a/bfd/elf64-target.h b/bfd/elf64-target.h index d7ee425aae..790e4a6d30 100644 --- a/bfd/elf64-target.h +++ b/bfd/elf64-target.h @@ -59,6 +59,28 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #define ELF_MAXPAGESIZE 1 #endif +#ifndef elf_backend_symbol_processing +#define elf_backend_symbol_processing 0 /* elf_backend_symbol_processing */ +#endif +#ifndef elf_backend_symbol_table_processing +#define elf_backend_symbol_table_processing 0 /* elf_backend_symbol_table_processing */ +#endif +#ifndef elf_backend_section_processing +#define elf_backend_section_processing 0 /* elf_backend_section_processing */ +#endif +#ifndef elf_backend_section_from_shdr +#define elf_backend_section_from_shdr 0 /* elf_backend_section_from_shdr */ +#endif +#ifndef elf_backend_fake_sections +#define elf_backend_fake_sections 0 /* elf_backend_fake_sections */ +#endif +#ifndef elf_backend_section_from_bfd_section +#define elf_backend_section_from_bfd_section 0 /* elf_backend_section_from_bfd_section */ +#endif +#ifndef elf_backend_ecoff_debug_swap +#define elf_backend_ecoff_debug_swap 0 /* elf_backed_ecoff_debug_swap */ +#endif + static CONST struct elf_backend_data elf64_bed = { #ifdef USE_REL @@ -66,15 +88,18 @@ static CONST struct elf_backend_data elf64_bed = #else 1, /* use_rela_p */ #endif - 0, /* elf_64_p */ + 1, /* elf_64_p */ ELF_ARCH, /* arch */ - elf_info_to_howto, /* elf_info_to_howto */ -#ifdef elf_info_to_howto_rel - elf_info_to_howto_rel, /* elf_info_to_howto_rel */ -#else - 0, /* elf_info_to_howto_rel */ -#endif ELF_MAXPAGESIZE, /* maxpagesize */ + elf_info_to_howto, /* elf_info_to_howto */ + elf_info_to_howto_rel, /* elf_info_to_howto_rel */ + elf_backend_symbol_processing, /* elf_backend_symbol_processing */ + elf_backend_symbol_table_processing, /* elf_backend_symbol_table_processing */ + elf_backend_section_processing, /* elf_backend_section_processing */ + elf_backend_section_from_shdr, /* elf_backend_section_from_shdr */ + elf_backend_fake_sections, /* elf_backend_fake_sections */ + elf_backend_section_from_bfd_section, /* elf_backend_section_from_bfd_section */ + elf_backend_ecoff_debug_swap /* elf_backend_ecoff_debug_swap */ }; #ifdef TARGET_BIG_SYM diff --git a/bfd/libelf.h b/bfd/libelf.h index 187c51a29c..2c0969a9ab 100644 --- a/bfd/libelf.h +++ b/bfd/libelf.h @@ -42,10 +42,18 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #define ElfNAME(X) NAME(Elf,X) #define elfNAME(X) NAME(elf,X) +/* 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; + /* Backend specific information. */ union { unsigned int hppa_arg_reloc; @@ -54,24 +62,77 @@ typedef struct tc_data; } 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 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)); + /* The remaining functions are hooks which are called only if they + are not NULL. */ + + /* 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 *)); - boolean (*elf_backend_symbol_table_processing) PARAMS ((bfd *, elf_symbol_type *, int)); - boolean (*elf_backend_section_processing) PARAMS ((bfd *, Elf32_Internal_Shdr *)); - boolean (*elf_backend_section_from_shdr) PARAMS ((bfd *, Elf32_Internal_Shdr *, char *)); - boolean (*elf_backend_fake_sections) PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *)); - boolean (*elf_backend_section_from_bfd_section) PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *, int *)); + + /* 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)); + + /* 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 elf_sym_extra