/* MeP-specific support for 32-bit ELF.
- Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
- Free Software Foundation, Inc.
+ Copyright (C) 2001-2017 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
/* Private relocation functions. */
\f
#define MEPREL(type, size, bits, right, left, pcrel, overflow, mask) \
- {(unsigned)type, right, size, bits, pcrel, left, overflow, mep_reloc, #type, FALSE, 0, mask, 0 }
+ {(unsigned)type, right, size, bits, pcrel, left, overflow, bfd_elf_generic_reloc, #type, FALSE, 0, mask, 0 }
#define N complain_overflow_dont
#define S complain_overflow_signed
#define U complain_overflow_unsigned
-static bfd_reloc_status_type mep_reloc (bfd *, arelent *, struct bfd_symbol *,
- void *, asection *, bfd *, char **);
-
static reloc_howto_type mep_elf_howto_table [] =
{
/* type, size, bits, leftshift, rightshift, pcrel, OD/OS/OU, mask. */
- MEPREL (R_MEP_NONE, 0, 0, 0, 0, 0, N, 0),
+ MEPREL (R_MEP_NONE, 3, 0, 0, 0, 0, N, 0),
MEPREL (R_RELC, 0, 0, 0, 0, 0, N, 0),
/* MEPRELOC:HOWTO */
/* This section generated from bfd/mep-relocs.pl from include/elf/mep.h. */
#undef N
#undef S
#undef U
-
-static bfd_reloc_status_type
-mep_reloc
- (bfd * abfd ATTRIBUTE_UNUSED,
- arelent * reloc_entry ATTRIBUTE_UNUSED,
- struct bfd_symbol * symbol ATTRIBUTE_UNUSED,
- void * data ATTRIBUTE_UNUSED,
- asection * input_section ATTRIBUTE_UNUSED,
- bfd * output_bfd ATTRIBUTE_UNUSED,
- char ** error_message ATTRIBUTE_UNUSED)
-{
- return bfd_reloc_ok;
-}
-
\f
#define BFD_RELOC_MEP_NONE BFD_RELOC_NONE
default:
/* Pacify gcc -Wall. */
- fprintf (stderr, "mep: no reloc for code %d\n", code);
+ _bfd_error_handler (_("mep: no reloc for code %d"), code);
return NULL;
}
if (mep_elf_howto_table[type].type != type)
{
- fprintf (stderr, "MeP: howto %d has type %d\n", type, mep_elf_howto_table[type].type);
+ /* xgettext:c-format */
+ _bfd_error_handler (_("MeP: howto %d has type %d"),
+ type, mep_elf_howto_table[type].type);
abort ();
}
unsigned int r_type;
r_type = ELF32_R_TYPE (dst->r_info);
+ if (r_type >= R_MEP_max)
+ {
+ /* xgettext:c-format */
+ _bfd_error_handler (_("%B: invalid MEP reloc number: %d"), abfd, r_type);
+ r_type = 0;
+ }
cache_ptr->howto = & mep_elf_howto_table [r_type];
}
\f
}
else
{
- bfd_boolean warned, unresolved_reloc;
+ bfd_boolean warned, unresolved_reloc, ignored;
RELOC_FOR_GLOBAL_SYMBOL(info, input_bfd, input_section, rel,
r_symndx, symtab_hdr, sym_hashes,
h, sec, relocation,
- unresolved_reloc, warned);
+ unresolved_reloc, warned, ignored);
name = h->root.root.string;
}
- if (sec != NULL && elf_discarded_section (sec))
+ if (sec != NULL && discarded_section (sec))
RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
- rel, relend, howto, contents);
+ rel, 1, relend, howto, 0, contents);
- if (info->relocatable)
+ if (bfd_link_relocatable (info))
continue;
if (r_type == R_RELC)
switch (r)
{
case bfd_reloc_overflow:
- r = info->callbacks->reloc_overflow
+ (*info->callbacks->reloc_overflow)
(info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
input_bfd, input_section, rel->r_offset);
break;
case bfd_reloc_undefined:
- r = info->callbacks->undefined_symbol
+ (*info->callbacks->undefined_symbol)
(info, name, input_bfd, input_section, rel->r_offset, TRUE);
break;
}
if (msg)
- r = info->callbacks->warning
- (info, msg, name, input_bfd, input_section, rel->r_offset);
-
- if (! r)
- return FALSE;
+ (*info->callbacks->warning) (info, msg, name, input_bfd,
+ input_section, rel->r_offset);
}
}
return TRUE;
}
-static bfd_boolean
-mep_elf_copy_private_bfd_data (bfd * ibfd, bfd * obfd)
-{
- if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
- || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
- return TRUE;
-
- elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
- elf_flags_init (obfd) = TRUE;
-
- /* Copy object attributes. */
- _bfd_elf_copy_obj_attributes (ibfd, obfd);
-
- return TRUE;
-}
-
/* Merge backend specific data from an object file to the output
object file when linking. */
static bfd_boolean
-mep_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
+mep_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
{
+ bfd *obfd = info->output_bfd;
static bfd *last_ibfd = 0;
flagword old_flags, new_flags;
flagword old_partial, new_partial;
- /* Check if we have the same endianess. */
- if (_bfd_generic_verify_endian_match (ibfd, obfd) == FALSE)
+ /* Check if we have the same endianness. */
+ if (!_bfd_generic_verify_endian_match (ibfd, info))
return FALSE;
new_flags = elf_elfheader (ibfd)->e_flags;
old_flags = (old_flags & ~EF_MEP_CPU_MASK) | new_partial;
else
{
+ /* xgettext:c-format */
_bfd_error_handler (_("%B and %B are for different cores"), last_ibfd, ibfd);
bfd_set_error (bfd_error_invalid_target);
return FALSE;
old_flags = (old_flags & ~EF_MEP_INDEX_MASK) | new_partial;
else
{
+ /* xgettext:c-format */
_bfd_error_handler (_("%B and %B are for different configurations"), last_ibfd, ibfd);
bfd_set_error (bfd_error_invalid_target);
return FALSE;
#define ELF_MACHINE_CODE EM_CYGNUS_MEP
#define ELF_MAXPAGESIZE 0x1000
-#define TARGET_BIG_SYM bfd_elf32_mep_vec
+#define TARGET_BIG_SYM mep_elf32_vec
#define TARGET_BIG_NAME "elf32-mep"
-#define TARGET_LITTLE_SYM bfd_elf32_mep_little_vec
+#define TARGET_LITTLE_SYM mep_elf32_le_vec
#define TARGET_LITTLE_NAME "elf32-mep-little"
#define elf_info_to_howto_rel NULL
#define bfd_elf32_bfd_reloc_type_lookup mep_reloc_type_lookup
#define bfd_elf32_bfd_reloc_name_lookup mep_reloc_name_lookup
#define bfd_elf32_bfd_set_private_flags mep_elf_set_private_flags
-#define bfd_elf32_bfd_copy_private_bfd_data mep_elf_copy_private_bfd_data
#define bfd_elf32_bfd_merge_private_bfd_data mep_elf_merge_private_bfd_data
#define bfd_elf32_bfd_print_private_bfd_data mep_elf_print_private_bfd_data