/* MIPS-specific support for 64-bit ELF
- Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ Copyright (C) 1996-2018 Free Software Foundation, Inc.
Ian Lance Taylor, Cygnus Support
Linker support added by Mark Mitchell, CodeSourcery, LLC.
<mark@codesourcery.com>
(bfd *, const Elf_Internal_Rela *, bfd_byte *);
static reloc_howto_type *bfd_elf64_bfd_reloc_type_lookup
(bfd *, bfd_reloc_code_real_type);
-static reloc_howto_type *mips_elf64_rtype_to_howto
- (unsigned int, bfd_boolean);
-static void mips_elf64_info_to_howto_rel
- (bfd *, arelent *, Elf_Internal_Rela *);
-static void mips_elf64_info_to_howto_rela
+static bfd_boolean mips_elf64_info_to_howto_rela
(bfd *, arelent *, Elf_Internal_Rela *);
static long mips_elf64_get_dynamic_reloc_upper_bound
(bfd *);
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
- /* This needs complex overflow
+ /* This needs complex overflow
detection, because the upper four
bits must match the PC. */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MIPS16_GPREL", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
- 0x0000ffff, /* dst_mask */
+ 0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* A MIPS16 reference to the global offset table. */
"R_MIPS16_GOT16", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
- 0x0000ffff, /* dst_mask */
+ 0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* A MIPS16 call through the global offset table. */
"R_MIPS16_CALL16", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
- 0x0000ffff, /* dst_mask */
+ 0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* MIPS16 high 16 bits of symbol value. */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
- /* This needs complex overflow
+ /* This needs complex overflow
detection, because the upper four
bits must match the PC. */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MIPS16_GPREL", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
- 0x0000ffff, /* dst_mask */
+ 0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* A MIPS16 reference to the global offset table. */
"R_MIPS16_GOT16", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
- 0x0000ffff, /* dst_mask */
+ 0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* A MIPS16 call through the global offset table. */
"R_MIPS16_CALL16", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
- 0x0000ffff, /* dst_mask */
+ 0x0000ffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* MIPS16 high 16 bits of symbol value. */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
- /* This needs complex overflow
+ /* This needs complex overflow
detection, because the upper four
bits must match the PC. */
_bfd_mips_elf_generic_reloc, /* special_function */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
- /* This needs complex overflow
+ /* This needs complex overflow
detection, because the upper four
bits must match the PC. */
_bfd_mips_elf_generic_reloc, /* special_function */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MIPS_COPY", /* name */
FALSE, /* partial_inplace */
- 0x0, /* src_mask */
- 0x0, /* dst_mask */
+ 0x0, /* src_mask */
+ 0x0, /* dst_mask */
FALSE); /* pcrel_offset */
/* Originally a VxWorks extension, but now used for other systems too. */
_bfd_mips_elf_generic_reloc, /* special_function */
"R_MIPS_JUMP_SLOT", /* name */
FALSE, /* partial_inplace */
- 0x0, /* src_mask */
- 0x0, /* dst_mask */
+ 0x0, /* src_mask */
+ 0x0, /* dst_mask */
FALSE); /* pcrel_offset */
/* Used in EH tables. */
"R_MIPS_EH", /* name */
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
+ 0xffffffff, /* dst_mask */
FALSE); /* pcrel_offset */
\f
/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */
static reloc_howto_type *
-mips_elf64_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
+mips_elf64_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p)
{
switch (r_type)
{
}
if (r_type >= R_MIPS_max)
{
- _bfd_error_handler (_("unrecognised MIPS reloc number: %d"), r_type);
+ _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+ abfd, r_type);
bfd_set_error (bfd_error_bad_value);
r_type = R_MIPS_NONE;
}
/* Prevent relocation handling by bfd for MIPS ELF64. */
-static void
-mips_elf64_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
- arelent *cache_ptr ATTRIBUTE_UNUSED,
- Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
-{
- BFD_ASSERT (0);
-}
-
-static void
-mips_elf64_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
+static bfd_boolean
+mips_elf64_info_to_howto_rela (bfd *abfd,
arelent *cache_ptr ATTRIBUTE_UNUSED,
- Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
+ Elf_Internal_Rela *dst)
{
- BFD_ASSERT (0);
+ unsigned int r_type = ELF32_R_TYPE (dst->r_info);
+ /* xgettext:c-format */
+ _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+ abfd, r_type);
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
}
/* Since each entry in an SHT_REL or SHT_RELA section can represent up
relent->addend = rela.r_addend;
- relent->howto = mips_elf64_rtype_to_howto (type, rela_p);
+ relent->howto = mips_elf64_rtype_to_howto (abfd, type, rela_p);
++relent;
}
return FALSE;
case 136: /* Linux/MIPS - N64 kernel elf_prpsinfo */
+ elf_tdata (abfd)->core->pid
+ = bfd_get_32 (abfd, note->descdata + 24);
elf_tdata (abfd)->core->program
= _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
elf_tdata (abfd)->core->command
#define elf_backend_gc_mark_extra_sections \
_bfd_mips_elf_gc_mark_extra_sections
#define elf_info_to_howto mips_elf64_info_to_howto_rela
-#define elf_info_to_howto_rel mips_elf64_info_to_howto_rel
+#define elf_info_to_howto_rel mips_elf64_info_to_howto_rela
#define elf_backend_object_p mips_elf64_object_p
#define elf_backend_symbol_processing _bfd_mips_elf_symbol_processing
#define elf_backend_section_processing _bfd_mips_elf_section_processing