* elfcode.h (elf_object_p): Rather than looking through an array
of architectures, get the ELF EM_xxx code from the backend information. Let the generic ELF target match any EM_xxx code not matched by another ELF target. Call elf_backend_object_p to let the backend do more checks and set global information. * libelf.h (struct elf_backend_data): Added elf_machine_code and elf_backend_object_p fields. (struct bfd_elf_arch_map): Removed. (bfd_elf_arch_map, bfd_elf_arch_map_size): Don't declare. * elf32-target.h, elf64-target.h: Initialize elf_machine_code field with ELF_MACHINE_CODE. Initialize elf_backend_object_p field with elf_backend_object_p (if it is defined). * elf32-gen.c, elf32-hppa.c, elf32-i386.c, elf32-i860.c, elf32-m68k.c, elf32-m88k.c, elf32-mips.c, elf32-sparc.c, elf64-gen.c (ELF_MACHINE_CODE): Defined. * elf32-mips.c: Include ecoffswap.h to get ECOFF swapping routines. (mips_elf_object_p): Set the right machine number. (mips_elf_ecoff_debug_swap): Defined. (elf_backend_object_p): Defined to be mips_elf_object_p. (elf_backend_ecoff_debug_swap): Defined to be mips_elf_ecoff_debug_swap. * elf.c (bfd_elf_arch_map, bfd_elf_arch_map_size): Removed. * elf32-mips.c (elf_mips_howto_table): Don't complain on overflow for R_MIPS_26. Correct overflow detection requires matching the upper four bits of the destination against the PC. From Ted Lemon <mellon@pepper.ncd.com>. * elf32-hppa.c (elf_hppa_reloc_type_lookup): Return type should point to const data.
This commit is contained in:
parent
e4d7f4c779
commit
a5ccdad1fc
4 changed files with 39 additions and 20 deletions
|
@ -1585,7 +1585,7 @@ DEFUN (hppa_elf_reloc, (abfd, reloc_entry, symbol_in, data, input_section, outpu
|
|||
|
||||
}
|
||||
|
||||
static reloc_howto_type *
|
||||
static const reloc_howto_type *
|
||||
elf_hppa_reloc_type_lookup (arch, code)
|
||||
bfd_arch_info_type *arch;
|
||||
bfd_reloc_code_real_type code;
|
||||
|
@ -2236,13 +2236,15 @@ hppa_elf_build_arg_reloc_stub (abfd, output_bfd, reloc_entry, stub_types)
|
|||
if (!stub_desc->stub_contents)
|
||||
{
|
||||
stub_desc->allocated_size = STUB_BUFFER_INCR;
|
||||
stub_desc->stub_contents = (char *) xmalloc (STUB_BUFFER_INCR);
|
||||
stub_desc->stub_contents = (char *) bfd_xmalloc (STUB_BUFFER_INCR);
|
||||
}
|
||||
else if ((stub_desc->allocated_size - stub_desc->real_size) < STUB_MAX_SIZE)
|
||||
{
|
||||
stub_desc->allocated_size = stub_desc->allocated_size + STUB_BUFFER_INCR;
|
||||
stub_desc->stub_contents = (char *) xrealloc (stub_desc->stub_contents,
|
||||
stub_desc->allocated_size);
|
||||
stub_desc->stub_contents = (char *) realloc (stub_desc->stub_contents,
|
||||
stub_desc->allocated_size);
|
||||
if (stub_desc->stub_contents == NULL)
|
||||
abort ();
|
||||
}
|
||||
|
||||
stub_desc->stub_secp = (int *) (stub_desc->stub_contents + stub_desc->real_size);
|
||||
|
@ -3148,12 +3150,10 @@ hppa_elf_get_section_contents (abfd, section, location, offset, count)
|
|||
be generated. */
|
||||
else if (strcmp (section->name, ".hppa_symextn") == 0)
|
||||
{
|
||||
/* If this is the first time through and there are no output
|
||||
sections, then read the contents of the symbol extension section
|
||||
from disk. */
|
||||
if (! symext_chain_built
|
||||
|| ((section->output_section == NULL)
|
||||
&& (abfd->direction == read_direction)))
|
||||
/* If there are no output sections, then read the contents of the
|
||||
symbol extension section from disk. */
|
||||
if (section->output_section == NULL
|
||||
&& abfd->direction == read_direction)
|
||||
{
|
||||
return bfd_generic_get_section_contents (abfd, section, location,
|
||||
offset, count);
|
||||
|
@ -3165,17 +3165,22 @@ hppa_elf_get_section_contents (abfd, section, location, offset, count)
|
|||
else if (! symext_chain_built)
|
||||
{
|
||||
int i;
|
||||
int *symtab_map = elf_sym_extra(section->output_section->owner);
|
||||
int *symtab_map =
|
||||
(int *) elf_sym_extra(section->output_section->owner);
|
||||
|
||||
for (i = 0; i < section->output_section->owner->symcount; i++ )
|
||||
{
|
||||
elf_hppa_tc_symbol(section->output_section->owner,
|
||||
section->output_section->owner->outsymbols[i],
|
||||
((elf_symbol_type *)
|
||||
section->output_section->owner->outsymbols[i]),
|
||||
symtab_map[i]);
|
||||
}
|
||||
symext_chain_built++;
|
||||
elf_hppa_tc_make_sections (section->output_section->owner, NULL);
|
||||
}
|
||||
|
||||
/* At this point we know that the symbol extension section has been
|
||||
built. We just need to copy it into the user's buffer. */
|
||||
if (count == 0)
|
||||
return true;
|
||||
|
||||
|
@ -3501,6 +3506,7 @@ DEFUN (elf32_hppa_backend_section_from_bfd_section, (abfd, hdr, asect, retval),
|
|||
#define TARGET_BIG_SYM bfd_elf32_hppa_vec
|
||||
#define TARGET_BIG_NAME "elf32-hppa"
|
||||
#define ELF_ARCH bfd_arch_hppa
|
||||
#define ELF_MACHINE_CODE EM_HPPA
|
||||
#define ELF_MAXPAGESIZE 0x1000
|
||||
|
||||
#include "elf32-target.h"
|
||||
|
|
|
@ -61,6 +61,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
#define ELF_MAXPAGESIZE 1
|
||||
#endif
|
||||
|
||||
#ifndef elf_backend_object_p
|
||||
#define elf_backend_object_p 0 /* elf_backend_object_p */
|
||||
#endif
|
||||
#ifndef elf_backend_symbol_processing
|
||||
#define elf_backend_symbol_processing 0 /* elf_backend_symbol_processing */
|
||||
#endif
|
||||
|
@ -92,9 +95,11 @@ static CONST struct elf_backend_data elf32_bed =
|
|||
#endif
|
||||
0, /* elf_64_p */
|
||||
ELF_ARCH, /* arch */
|
||||
ELF_MACHINE_CODE, /* elf_machine_code */
|
||||
ELF_MAXPAGESIZE, /* maxpagesize */
|
||||
elf_info_to_howto, /* elf_info_to_howto */
|
||||
elf_info_to_howto_rel, /* elf_info_to_howto_rel */
|
||||
elf_backend_object_p, /* elf_backend_object_p */
|
||||
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 */
|
||||
|
|
|
@ -59,6 +59,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
#define ELF_MAXPAGESIZE 1
|
||||
#endif
|
||||
|
||||
#ifndef elf_backend_object_p
|
||||
#define elf_backend_object_p 0 /* elf_backend_object_p */
|
||||
#endif
|
||||
#ifndef elf_backend_symbol_processing
|
||||
#define elf_backend_symbol_processing 0 /* elf_backend_symbol_processing */
|
||||
#endif
|
||||
|
@ -90,9 +93,11 @@ static CONST struct elf_backend_data elf64_bed =
|
|||
#endif
|
||||
1, /* elf_64_p */
|
||||
ELF_ARCH, /* arch */
|
||||
ELF_MACHINE_CODE, /* elf_machine_code */
|
||||
ELF_MAXPAGESIZE, /* maxpagesize */
|
||||
elf_info_to_howto, /* elf_info_to_howto */
|
||||
elf_info_to_howto_rel, /* elf_info_to_howto_rel */
|
||||
elf_backend_object_p, /* elf_backend_object_p */
|
||||
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 */
|
||||
|
|
19
bfd/libelf.h
19
bfd/libelf.h
|
@ -77,6 +77,9 @@ struct elf_backend_data
|
|||
/* 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;
|
||||
|
||||
|
@ -93,6 +96,14 @@ struct elf_backend_data
|
|||
/* 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 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. */
|
||||
|
@ -142,14 +153,6 @@ struct elf_sym_extra
|
|||
|
||||
typedef struct elf_sym_extra Elf_Sym_Extra;
|
||||
|
||||
struct bfd_elf_arch_map {
|
||||
enum bfd_architecture bfd_arch;
|
||||
int elf_arch;
|
||||
};
|
||||
|
||||
extern const struct bfd_elf_arch_map bfd_elf_arch_map[];
|
||||
extern const int bfd_elf_arch_map_size;
|
||||
|
||||
struct bfd_elf_section_data {
|
||||
Elf_Internal_Shdr this_hdr;
|
||||
Elf_Internal_Shdr rel_hdr;
|
||||
|
|
Loading…
Reference in a new issue