[PATCH] MIPS: remove SHT_REL support for NewABI elf backends
YunQiang Su
wzssyqa@gmail.com
Tue Mar 30 06:41:45 GMT 2021
CC Pual Hua.
YunQiang Su <yunqiang.su@cipunited.com> 于2021年3月12日周五 下午4:57写道:
>
> Given that MIPS NewABI ELF always use SHT_RELA in realworld,
> and our SHT_REL implementation in backend is incomplete, it
> filled with FIXME and TODO in code and produce tons of
> assertion failure and other errors when meeting SHT_REL,
> it's time to remove it.
> ---
> bfd/elf64-mips.c | 1700 +--------------------------------------------
> bfd/elfn32-mips.c | 1513 +---------------------------------------
> 2 files changed, 24 insertions(+), 3189 deletions(-)
>
> diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c
> index e1a00448fb..180363ea25 100644
> --- a/bfd/elf64-mips.c
> +++ b/bfd/elf64-mips.c
> @@ -31,8 +31,6 @@
> /* TODO: Many things are unsupported, even if there is some code for it
> . (which was mostly stolen from elf32-mips.c and slightly adapted).
> .
> - . - Relocation handling for REL relocs is wrong in many cases and
> - . generally untested.
> . - Relocation handling for RELA relocs related to GOT support are
> . also likely to be wrong.
> . - Support for MIPS16 is untested.
> @@ -62,18 +60,10 @@
> #define ECOFF_SIGNED_64
> #include "ecoffswap.h"
>
> -static void mips_elf64_swap_reloc_in
> - (bfd *, const Elf64_Mips_External_Rel *, Elf64_Mips_Internal_Rela *);
> static void mips_elf64_swap_reloca_in
> (bfd *, const Elf64_Mips_External_Rela *, Elf64_Mips_Internal_Rela *);
> -static void mips_elf64_swap_reloc_out
> - (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rel *);
> static void mips_elf64_swap_reloca_out
> (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rela *);
> -static void mips_elf64_be_swap_reloc_in
> - (bfd *, const bfd_byte *, Elf_Internal_Rela *);
> -static void mips_elf64_be_swap_reloc_out
> - (bfd *, const Elf_Internal_Rela *, bfd_byte *);
> static void mips_elf64_be_swap_reloca_in
> (bfd *, const bfd_byte *, Elf_Internal_Rela *);
> static void mips_elf64_be_swap_reloca_out
> @@ -91,8 +81,6 @@ static bfd_boolean mips_elf64_slurp_reloc_table
> (bfd *, asection *, asymbol **, bfd_boolean);
> static void mips_elf64_write_relocs
> (bfd *, asection *, void *);
> -static void mips_elf64_write_rel
> - (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
> static void mips_elf64_write_rela
> (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
> static bfd_reloc_status_type mips_elf64_gprel16_reloc
> @@ -127,772 +115,8 @@ extern const bfd_target mips_elf64_le_vec;
>
> /* The number of local .got entries we reserve. */
> #define MIPS_RESERVED_GOTNO (2)
> -
> -/* The relocation table used for SHT_REL sections. */
> -
> -static reloc_howto_type mips_elf64_howto_table_rel[] =
> -{
> - /* No relocation. */
> - HOWTO (R_MIPS_NONE, /* type */
> - 0, /* rightshift */
> - 3, /* size (0 = byte, 1 = short, 2 = long) */
> - 0, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_NONE", /* name */
> - FALSE, /* partial_inplace */
> - 0, /* src_mask */
> - 0, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 16 bit relocation. */
> - HOWTO (R_MIPS_16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 32 bit relocation. */
> - HOWTO (R_MIPS_32, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_32", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 32 bit symbol relative relocation. */
> - HOWTO (R_MIPS_REL32, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_REL32", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 26 bit jump address. */
> - HOWTO (R_MIPS_26, /* type */
> - 2, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 26, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - /* This needs complex overflow
> - detection, because the upper 36
> - bits must match the PC + 4. */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_26", /* name */
> - TRUE, /* partial_inplace */
> - 0x03ffffff, /* src_mask */
> - 0x03ffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
> - However, the native IRIX6 tools use them, so we try our best. */
> -
> - /* High 16 bits of symbol value. */
> - HOWTO (R_MIPS_HI16, /* type */
> - 16, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_hi16_reloc, /* special_function */
> - "R_MIPS_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Low 16 bits of symbol value. */
> - HOWTO (R_MIPS_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_lo16_reloc, /* special_function */
> - "R_MIPS_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* GP relative reference. */
> - HOWTO (R_MIPS_GPREL16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - mips_elf64_gprel16_reloc, /* special_function */
> - "R_MIPS_GPREL16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Reference to literal section. */
> - HOWTO (R_MIPS_LITERAL, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - mips_elf64_literal_reloc, /* special_function */
> - "R_MIPS_LITERAL", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Reference to global offset table. */
> - HOWTO (R_MIPS_GOT16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_got16_reloc, /* special_function */
> - "R_MIPS_GOT16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 16 bit PC relative reference. Note that the ABI document has a typo
> - and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
> - We do the right thing here. */
> - HOWTO (R_MIPS_PC16, /* type */
> - 2, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_PC16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - /* 16 bit call through global offset table. */
> - HOWTO (R_MIPS_CALL16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_CALL16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 32 bit GP relative reference. */
> - HOWTO (R_MIPS_GPREL32, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - mips_elf64_gprel32_reloc, /* special_function */
> - "R_MIPS_GPREL32", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - EMPTY_HOWTO (13),
> - EMPTY_HOWTO (14),
> - EMPTY_HOWTO (15),
> -
> - /* A 5 bit shift field. */
> - HOWTO (R_MIPS_SHIFT5, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 5, /* bitsize */
> - FALSE, /* pc_relative */
> - 6, /* bitpos */
> - complain_overflow_bitfield, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_SHIFT5", /* name */
> - TRUE, /* partial_inplace */
> - 0x000007c0, /* src_mask */
> - 0x000007c0, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* A 6 bit shift field. */
> - HOWTO (R_MIPS_SHIFT6, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 6, /* bitsize */
> - FALSE, /* pc_relative */
> - 6, /* bitpos */
> - complain_overflow_bitfield, /* complain_on_overflow */
> - mips_elf64_shift6_reloc, /* special_function */
> - "R_MIPS_SHIFT6", /* name */
> - TRUE, /* partial_inplace */
> - 0x000007c4, /* src_mask */
> - 0x000007c4, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 64 bit relocation. */
> - HOWTO (R_MIPS_64, /* type */
> - 0, /* rightshift */
> - 4, /* size (0 = byte, 1 = short, 2 = long) */
> - 64, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_64", /* name */
> - TRUE, /* partial_inplace */
> - MINUS_ONE, /* src_mask */
> - MINUS_ONE, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Displacement in the global offset table. */
> - HOWTO (R_MIPS_GOT_DISP, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_GOT_DISP", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Displacement to page pointer in the global offset table. */
> - HOWTO (R_MIPS_GOT_PAGE, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_GOT_PAGE", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Offset from page pointer in the global offset table. */
> - HOWTO (R_MIPS_GOT_OFST, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_GOT_OFST", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* High 16 bits of displacement in global offset table. */
> - HOWTO (R_MIPS_GOT_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_GOT_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Low 16 bits of displacement in global offset table. */
> - HOWTO (R_MIPS_GOT_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_GOT_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 64 bit subtraction. */
> - HOWTO (R_MIPS_SUB, /* type */
> - 0, /* rightshift */
> - 4, /* size (0 = byte, 1 = short, 2 = long) */
> - 64, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_SUB", /* name */
> - TRUE, /* partial_inplace */
> - MINUS_ONE, /* src_mask */
> - MINUS_ONE, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Insert the addend as an instruction. */
> - /* FIXME: Not handled correctly. */
> - HOWTO (R_MIPS_INSERT_A, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_INSERT_A", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Insert the addend as an instruction, and change all relocations
> - to refer to the old instruction at the address. */
> - /* FIXME: Not handled correctly. */
> - HOWTO (R_MIPS_INSERT_B, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_INSERT_B", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Delete a 32 bit instruction. */
> - /* FIXME: Not handled correctly. */
> - HOWTO (R_MIPS_DELETE, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_DELETE", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
> - We don't, because
> - a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
> - R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
> - fallable heuristics.
> - b) No other NewABI toolchain actually emits such relocations. */
> - EMPTY_HOWTO (R_MIPS_HIGHER),
> - EMPTY_HOWTO (R_MIPS_HIGHEST),
> -
> - /* High 16 bits of displacement in global offset table. */
> - HOWTO (R_MIPS_CALL_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_CALL_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Low 16 bits of displacement in global offset table. */
> - HOWTO (R_MIPS_CALL_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_CALL_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Section displacement, used by an associated event location section. */
> - HOWTO (R_MIPS_SCN_DISP, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_SCN_DISP", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - HOWTO (R_MIPS_REL16, /* type */
> - 0, /* rightshift */
> - 1, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_REL16", /* name */
> - TRUE, /* partial_inplace */
> - 0xffff, /* src_mask */
> - 0xffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* These two are obsolete. */
> - EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
> - EMPTY_HOWTO (R_MIPS_PJUMP),
> -
> - /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
> - It must be used for multigot GOT's (and only there). */
> - HOWTO (R_MIPS_RELGOT, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_RELGOT", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Protected jump conversion. This is an optimization hint. No
> - relocation is required for correctness. */
> - HOWTO (R_MIPS_JALR, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_JALR", /* name */
> - FALSE, /* partial_inplace */
> - 0, /* src_mask */
> - 0x00000000, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS relocations. */
> - EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
> - EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
> -
> - HOWTO (R_MIPS_TLS_DTPMOD64, /* type */
> - 0, /* rightshift */
> - 4, /* size (0 = byte, 1 = short, 2 = long) */
> - 64, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_DTPMOD64", /* name */
> - TRUE, /* partial_inplace */
> - MINUS_ONE, /* src_mask */
> - MINUS_ONE, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - HOWTO (R_MIPS_TLS_DTPREL64, /* type */
> - 0, /* rightshift */
> - 4, /* size (0 = byte, 1 = short, 2 = long) */
> - 64, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_DTPREL64", /* name */
> - TRUE, /* partial_inplace */
> - MINUS_ONE, /* src_mask */
> - MINUS_ONE, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS general dynamic variable reference. */
> - HOWTO (R_MIPS_TLS_GD, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_GD", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS local dynamic variable reference. */
> - HOWTO (R_MIPS_TLS_LDM, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_LDM", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS local dynamic offset. */
> - HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_DTPREL_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS local dynamic offset. */
> - HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_DTPREL_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS thread pointer offset. */
> - HOWTO (R_MIPS_TLS_GOTTPREL, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_GOTTPREL", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS IE dynamic relocations. */
> - EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
> -
> - HOWTO (R_MIPS_TLS_TPREL64, /* type */
> - 0, /* rightshift */
> - 4, /* size (0 = byte, 1 = short, 2 = long) */
> - 64, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_TPREL64", /* name */
> - TRUE, /* partial_inplace */
> - MINUS_ONE, /* src_mask */
> - MINUS_ONE, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS thread pointer offset. */
> - HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_TPREL_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS thread pointer offset. */
> - HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_TPREL_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 32 bit relocation with no addend. */
> - HOWTO (R_MIPS_GLOB_DAT, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_GLOB_DAT", /* name */
> - FALSE, /* partial_inplace */
> - 0x0, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - EMPTY_HOWTO (52),
> - EMPTY_HOWTO (53),
> - EMPTY_HOWTO (54),
> - EMPTY_HOWTO (55),
> - EMPTY_HOWTO (56),
> - EMPTY_HOWTO (57),
> - EMPTY_HOWTO (58),
> - EMPTY_HOWTO (59),
> -
> - HOWTO (R_MIPS_PC21_S2, /* type */
> - 2, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 21, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_PC21_S2", /* name */
> - TRUE, /* partial_inplace */
> - 0x001fffff, /* src_mask */
> - 0x001fffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - HOWTO (R_MIPS_PC26_S2, /* type */
> - 2, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 26, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_PC26_S2", /* name */
> - TRUE, /* partial_inplace */
> - 0x03ffffff, /* src_mask */
> - 0x03ffffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - HOWTO (R_MIPS_PC18_S3, /* type */
> - 3, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 18, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_PC18_S3", /* name */
> - TRUE, /* partial_inplace */
> - 0x0003ffff, /* src_mask */
> - 0x0003ffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - HOWTO (R_MIPS_PC19_S2, /* type */
> - 2, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 19, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_PC19_S2", /* name */
> - TRUE, /* partial_inplace */
> - 0x0007ffff, /* src_mask */
> - 0x0007ffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - HOWTO (R_MIPS_PCHI16, /* type */
> - 16, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_PCHI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - HOWTO (R_MIPS_PCLO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_PCLO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> -};
>
> /* The relocation table used for SHT_RELA sections. */
> -
> static reloc_howto_type mips_elf64_howto_table_rela[] =
> {
> /* No relocation. */
> @@ -1672,222 +896,6 @@ static reloc_howto_type mips_elf64_howto_table_rela[] =
>
> };
>
> -static reloc_howto_type mips16_elf64_howto_table_rel[] =
> -{
> - /* The reloc used for the mips16 jump instruction. */
> - HOWTO (R_MIPS16_26, /* type */
> - 2, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 26, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - /* This needs complex overflow
> - detection, because the upper four
> - bits must match the PC. */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_26", /* name */
> - TRUE, /* partial_inplace */
> - 0x3ffffff, /* src_mask */
> - 0x3ffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* The reloc used for the mips16 gprel instruction. */
> - HOWTO (R_MIPS16_GPREL, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - mips16_gprel_reloc, /* special_function */
> - "R_MIPS16_GPREL", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* A MIPS16 reference to the global offset table. */
> - HOWTO (R_MIPS16_GOT16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_got16_reloc, /* special_function */
> - "R_MIPS16_GOT16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* A MIPS16 call through the global offset table. */
> - HOWTO (R_MIPS16_CALL16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_CALL16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 high 16 bits of symbol value. */
> - HOWTO (R_MIPS16_HI16, /* type */
> - 16, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_hi16_reloc, /* special_function */
> - "R_MIPS16_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 low 16 bits of symbol value. */
> - HOWTO (R_MIPS16_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_lo16_reloc, /* special_function */
> - "R_MIPS16_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 TLS general dynamic variable reference. */
> - HOWTO (R_MIPS16_TLS_GD, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_TLS_GD", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 TLS local dynamic variable reference. */
> - HOWTO (R_MIPS16_TLS_LDM, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_TLS_LDM", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 TLS local dynamic offset. */
> - HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_TLS_DTPREL_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 TLS local dynamic offset. */
> - HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_TLS_DTPREL_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 TLS thread pointer offset. */
> - HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_TLS_GOTTPREL", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 TLS thread pointer offset. */
> - HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_TLS_TPREL_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 TLS thread pointer offset. */
> - HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_TLS_TPREL_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 16-bit PC-relative branch offset. */
> - HOWTO (R_MIPS16_PC16_S1, /* type */
> - 1, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_PC16_S1", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -};
> -
> static reloc_howto_type mips16_elf64_howto_table_rela[] =
> {
> /* The reloc used for the mips16 jump instruction. */
> @@ -2104,485 +1112,6 @@ static reloc_howto_type mips16_elf64_howto_table_rela[] =
> TRUE), /* pcrel_offset */
> };
>
> -static reloc_howto_type micromips_elf64_howto_table_rel[] =
> -{
> - EMPTY_HOWTO (130),
> - EMPTY_HOWTO (131),
> - EMPTY_HOWTO (132),
> -
> - /* 26 bit jump address. */
> - HOWTO (R_MICROMIPS_26_S1, /* type */
> - 1, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 26, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - /* This needs complex overflow
> - detection, because the upper four
> - bits must match the PC. */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_26_S1", /* name */
> - TRUE, /* partial_inplace */
> - 0x3ffffff, /* src_mask */
> - 0x3ffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* High 16 bits of symbol value. */
> - HOWTO (R_MICROMIPS_HI16, /* type */
> - 16, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_hi16_reloc, /* special_function */
> - "R_MICROMIPS_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Low 16 bits of symbol value. */
> - HOWTO (R_MICROMIPS_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_lo16_reloc, /* special_function */
> - "R_MICROMIPS_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* GP relative reference. */
> - HOWTO (R_MICROMIPS_GPREL16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf32_gprel16_reloc, /* special_function */
> - "R_MICROMIPS_GPREL16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Reference to literal section. */
> - HOWTO (R_MICROMIPS_LITERAL, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf32_gprel16_reloc, /* special_function */
> - "R_MICROMIPS_LITERAL", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Reference to global offset table. */
> - HOWTO (R_MICROMIPS_GOT16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_got16_reloc, /* special_function */
> - "R_MICROMIPS_GOT16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* This is for microMIPS branches. */
> - HOWTO (R_MICROMIPS_PC7_S1, /* type */
> - 1, /* rightshift */
> - 1, /* size (0 = byte, 1 = short, 2 = long) */
> - 7, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_PC7_S1", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000007f, /* src_mask */
> - 0x0000007f, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - HOWTO (R_MICROMIPS_PC10_S1, /* type */
> - 1, /* rightshift */
> - 1, /* size (0 = byte, 1 = short, 2 = long) */
> - 10, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_PC10_S1", /* name */
> - TRUE, /* partial_inplace */
> - 0x000003ff, /* src_mask */
> - 0x000003ff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - HOWTO (R_MICROMIPS_PC16_S1, /* type */
> - 1, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_PC16_S1", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - /* 16 bit call through global offset table. */
> - HOWTO (R_MICROMIPS_CALL16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_CALL16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - EMPTY_HOWTO (143),
> - EMPTY_HOWTO (144),
> -
> - /* Displacement in the global offset table. */
> - HOWTO (R_MICROMIPS_GOT_DISP, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_GOT_DISP",/* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Displacement to page pointer in the global offset table. */
> - HOWTO (R_MICROMIPS_GOT_PAGE, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_GOT_PAGE",/* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Offset from page pointer in the global offset table. */
> - HOWTO (R_MICROMIPS_GOT_OFST, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_GOT_OFST",/* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* High 16 bits of displacement in global offset table. */
> - HOWTO (R_MICROMIPS_GOT_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_GOT_HI16",/* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Low 16 bits of displacement in global offset table. */
> - HOWTO (R_MICROMIPS_GOT_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_GOT_LO16",/* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 64 bit subtraction. Used in the N32 ABI. */
> - HOWTO (R_MICROMIPS_SUB, /* type */
> - 0, /* rightshift */
> - 4, /* size (0 = byte, 1 = short, 2 = long) */
> - 64, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_SUB", /* name */
> - TRUE, /* partial_inplace */
> - MINUS_ONE, /* src_mask */
> - MINUS_ONE, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* We don't support these for REL relocations, because it means building
> - the addend from a R_MICROMIPS_HIGHEST/R_MICROMIPS_HIGHER/
> - R_MICROMIPS_HI16/R_MICROMIPS_LO16 sequence with varying ordering,
> - using fallable heuristics. */
> - EMPTY_HOWTO (R_MICROMIPS_HIGHER),
> - EMPTY_HOWTO (R_MICROMIPS_HIGHEST),
> -
> - /* High 16 bits of displacement in global offset table. */
> - HOWTO (R_MICROMIPS_CALL_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_CALL_HI16",/* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Low 16 bits of displacement in global offset table. */
> - HOWTO (R_MICROMIPS_CALL_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_CALL_LO16",/* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Section displacement. */
> - HOWTO (R_MICROMIPS_SCN_DISP, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_SCN_DISP", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Protected jump conversion. This is an optimization hint. No
> - relocation is required for correctness. */
> - HOWTO (R_MICROMIPS_JALR, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_JALR", /* name */
> - FALSE, /* partial_inplace */
> - 0, /* src_mask */
> - 0x00000000, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Low 16 bits of symbol value. Note that the high 16 bits of symbol values
> - must be zero. This is used for relaxation. */
> - HOWTO (R_MICROMIPS_HI0_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_HI0_LO16",/* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - EMPTY_HOWTO (158),
> - EMPTY_HOWTO (159),
> - EMPTY_HOWTO (160),
> - EMPTY_HOWTO (161),
> -
> - /* TLS general dynamic variable reference. */
> - HOWTO (R_MICROMIPS_TLS_GD, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_TLS_GD", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS local dynamic variable reference. */
> - HOWTO (R_MICROMIPS_TLS_LDM, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_TLS_LDM", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS local dynamic offset. */
> - HOWTO (R_MICROMIPS_TLS_DTPREL_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_TLS_DTPREL_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS local dynamic offset. */
> - HOWTO (R_MICROMIPS_TLS_DTPREL_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_TLS_DTPREL_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS thread pointer offset. */
> - HOWTO (R_MICROMIPS_TLS_GOTTPREL, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_TLS_GOTTPREL", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - EMPTY_HOWTO (167),
> - EMPTY_HOWTO (168),
> -
> - /* TLS thread pointer offset. */
> - HOWTO (R_MICROMIPS_TLS_TPREL_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_TLS_TPREL_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS thread pointer offset. */
> - HOWTO (R_MICROMIPS_TLS_TPREL_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_TLS_TPREL_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - EMPTY_HOWTO (171),
> -
> - /* GP- and PC-relative relocations. */
> - HOWTO (R_MICROMIPS_GPREL7_S2, /* type */
> - 2, /* rightshift */
> - 1, /* size (0 = byte, 1 = short, 2 = long) */
> - 7, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf32_gprel16_reloc, /* special_function */
> - "R_MICROMIPS_GPREL7_S2", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000007f, /* src_mask */
> - 0x0000007f, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - HOWTO (R_MICROMIPS_PC23_S2, /* type */
> - 2, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 23, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_PC23_S2", /* name */
> - TRUE, /* partial_inplace */
> - 0x007fffff, /* src_mask */
> - 0x007fffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -};
> -
> static reloc_howto_type micromips_elf64_howto_table_rela[] =
> {
> EMPTY_HOWTO (130),
> @@ -3214,21 +1743,6 @@ static reloc_howto_type elf_mips_eh_howto =
> 0xffffffff, /* dst_mask */
> FALSE); /* pcrel_offset */
>
> -
> -/* Swap in a MIPS 64-bit Rel reloc. */
> -
> -static void
> -mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src,
> - Elf64_Mips_Internal_Rela *dst)
> -{
> - dst->r_offset = H_GET_64 (abfd, src->r_offset);
> - dst->r_sym = H_GET_32 (abfd, src->r_sym);
> - dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
> - dst->r_type3 = H_GET_8 (abfd, src->r_type3);
> - dst->r_type2 = H_GET_8 (abfd, src->r_type2);
> - dst->r_type = H_GET_8 (abfd, src->r_type);
> - dst->r_addend = 0;
> -}
>
> /* Swap in a MIPS 64-bit Rela reloc. */
>
> @@ -3245,20 +1759,6 @@ mips_elf64_swap_reloca_in (bfd *abfd, const Elf64_Mips_External_Rela *src,
> dst->r_addend = H_GET_S64 (abfd, src->r_addend);
> }
>
> -/* Swap out a MIPS 64-bit Rel reloc. */
> -
> -static void
> -mips_elf64_swap_reloc_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
> - Elf64_Mips_External_Rel *dst)
> -{
> - H_PUT_64 (abfd, src->r_offset, dst->r_offset);
> - H_PUT_32 (abfd, src->r_sym, dst->r_sym);
> - H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
> - H_PUT_8 (abfd, src->r_type3, dst->r_type3);
> - H_PUT_8 (abfd, src->r_type2, dst->r_type2);
> - H_PUT_8 (abfd, src->r_type, dst->r_type);
> -}
> -
> /* Swap out a MIPS 64-bit Rela reloc. */
>
> static void
> @@ -3274,28 +1774,6 @@ mips_elf64_swap_reloca_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
> H_PUT_S64 (abfd, src->r_addend, dst->r_addend);
> }
>
> -/* Swap in a MIPS 64-bit Rel reloc. */
> -
> -static void
> -mips_elf64_be_swap_reloc_in (bfd *abfd, const bfd_byte *src,
> - Elf_Internal_Rela *dst)
> -{
> - Elf64_Mips_Internal_Rela mirel;
> -
> - mips_elf64_swap_reloc_in (abfd,
> - (const Elf64_Mips_External_Rel *) src,
> - &mirel);
> -
> - dst[0].r_offset = mirel.r_offset;
> - dst[0].r_info = ELF64_R_INFO (mirel.r_sym, mirel.r_type);
> - dst[0].r_addend = 0;
> - dst[1].r_offset = mirel.r_offset;
> - dst[1].r_info = ELF64_R_INFO (mirel.r_ssym, mirel.r_type2);
> - dst[1].r_addend = 0;
> - dst[2].r_offset = mirel.r_offset;
> - dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirel.r_type3);
> - dst[2].r_addend = 0;
> -}
>
> /* Swap in a MIPS 64-bit Rela reloc. */
>
> @@ -3320,27 +1798,6 @@ mips_elf64_be_swap_reloca_in (bfd *abfd, const bfd_byte *src,
> dst[2].r_addend = 0;
> }
>
> -/* Swap out a MIPS 64-bit Rel reloc. */
> -
> -static void
> -mips_elf64_be_swap_reloc_out (bfd *abfd, const Elf_Internal_Rela *src,
> - bfd_byte *dst)
> -{
> - Elf64_Mips_Internal_Rela mirel;
> -
> - mirel.r_offset = src[0].r_offset;
> - BFD_ASSERT(src[0].r_offset == src[1].r_offset);
> - BFD_ASSERT(src[0].r_offset == src[2].r_offset);
> -
> - mirel.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
> - mirel.r_sym = ELF64_R_SYM (src[0].r_info);
> - mirel.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
> - mirel.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
> - mirel.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
> -
> - mips_elf64_swap_reloc_out (abfd, &mirel,
> - (Elf64_Mips_External_Rel *) dst);
> -}
>
> /* Swap out a MIPS 64-bit Rela reloc. */
>
> @@ -3806,8 +2263,6 @@ bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
> bfd_reloc_code_real_type code)
> {
> unsigned int i;
> - /* FIXME: We default to RELA here instead of choosing the right
> - relocation variant. */
> reloc_howto_type *howto_table = mips_elf64_howto_table_rela;
> reloc_howto_type *howto16_table = mips16_elf64_howto_table_rela;
> reloc_howto_type *howto_micromips_table = micromips_elf64_howto_table_rela;
> @@ -3931,26 +2386,15 @@ mips_elf64_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p)
> default:
> if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
> {
> - if (rela_p)
> - howto
> - = µmips_elf64_howto_table_rela[r_type - R_MICROMIPS_min];
> - else
> - howto
> - = µmips_elf64_howto_table_rel[r_type - R_MICROMIPS_min];
> + howto = µmips_elf64_howto_table_rela[r_type - R_MICROMIPS_min];
> }
> if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
> {
> - if (rela_p)
> - howto = &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
> - else
> - howto = &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min];
> + howto = &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
> }
> if (r_type < R_MIPS_max)
> {
> - if (rela_p)
> - howto = &mips_elf64_howto_table_rela[r_type];
> - else
> - howto = &mips_elf64_howto_table_rel[r_type];
> + howto = &mips_elf64_howto_table_rela[r_type];
> }
> if (howto != NULL && howto->name != NULL)
> return howto;
> @@ -4008,7 +2452,6 @@ mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect,
> arelent *relent;
> bfd_vma i;
> int entsize;
> - bfd_boolean rela_p;
>
> if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
> return FALSE;
> @@ -4019,13 +2462,7 @@ mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect,
> native_relocs = allocated;
>
> entsize = rel_hdr->sh_entsize;
> - BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rel)
> - || entsize == sizeof (Elf64_Mips_External_Rela));
> -
> - if (entsize == sizeof (Elf64_Mips_External_Rel))
> - rela_p = FALSE;
> - else
> - rela_p = TRUE;
> + BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rela));
>
> if (dynamic)
> symcount = bfd_get_dynamic_symcount (abfd);
> @@ -4040,14 +2477,9 @@ mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect,
> bfd_boolean used_sym, used_ssym;
> int ir;
>
> - if (entsize == sizeof (Elf64_Mips_External_Rela))
> - mips_elf64_swap_reloca_in (abfd,
> - (Elf64_Mips_External_Rela *) native_relocs,
> - &rela);
> - else
> - mips_elf64_swap_reloc_in (abfd,
> - (Elf64_Mips_External_Rel *) native_relocs,
> - &rela);
> + mips_elf64_swap_reloca_in (abfd,
> + (Elf64_Mips_External_Rela *) native_relocs,
> + &rela);
>
> /* Each entry represents exactly three actual relocations. */
>
> @@ -4154,7 +2586,7 @@ mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect,
>
> relent->addend = rela.r_addend;
>
> - relent->howto = mips_elf64_rtype_to_howto (abfd, type, rela_p);
> + relent->howto = mips_elf64_rtype_to_howto (abfd, type, TRUE);
> if (relent->howto == NULL)
> goto error_return;
>
> @@ -4301,112 +2733,12 @@ mips_elf64_write_relocs (bfd *abfd, asection *sec, void *data)
>
> /* Do the actual relocation. */
>
> - if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rel))
> - mips_elf64_write_rel (abfd, sec, rel_hdr, &count, data);
> - else if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rela))
> + if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rela))
> mips_elf64_write_rela (abfd, sec, rel_hdr, &count, data);
> else
> BFD_ASSERT (0);
> }
>
> -static void
> -mips_elf64_write_rel (bfd *abfd, asection *sec,
> - Elf_Internal_Shdr *rel_hdr,
> - int *count, void *data)
> -{
> - bfd_boolean *failedp = data;
> - Elf64_Mips_External_Rel *ext_rel;
> - unsigned int idx;
> - asymbol *last_sym = 0;
> - int last_sym_idx = 0;
> -
> - rel_hdr->sh_size = rel_hdr->sh_entsize * *count;
> - rel_hdr->contents = bfd_alloc (abfd, rel_hdr->sh_size);
> - if (rel_hdr->contents == NULL)
> - {
> - *failedp = TRUE;
> - return;
> - }
> -
> - ext_rel = (Elf64_Mips_External_Rel *) rel_hdr->contents;
> - for (idx = 0; idx < sec->reloc_count; idx++, ext_rel++)
> - {
> - arelent *ptr;
> - Elf64_Mips_Internal_Rela int_rel;
> - asymbol *sym;
> - int n;
> - unsigned int i;
> -
> - ptr = sec->orelocation[idx];
> -
> - /* The address of an ELF reloc is section relative for an object
> - file, and absolute for an executable file or shared library.
> - The address of a BFD reloc is always section relative. */
> - if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
> - int_rel.r_offset = ptr->address;
> - else
> - int_rel.r_offset = ptr->address + sec->vma;
> -
> - sym = *ptr->sym_ptr_ptr;
> - if (sym == last_sym)
> - n = last_sym_idx;
> - else if (bfd_is_abs_section (sym->section) && sym->value == 0)
> - n = STN_UNDEF;
> - else
> - {
> - last_sym = sym;
> - n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
> - if (n < 0)
> - {
> - *failedp = TRUE;
> - return;
> - }
> - last_sym_idx = n;
> - }
> -
> - int_rel.r_sym = n;
> - int_rel.r_ssym = RSS_UNDEF;
> -
> - if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
> - && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
> - && ! _bfd_elf_validate_reloc (abfd, ptr))
> - {
> - *failedp = TRUE;
> - return;
> - }
> -
> - int_rel.r_type = ptr->howto->type;
> - int_rel.r_type2 = (int) R_MIPS_NONE;
> - int_rel.r_type3 = (int) R_MIPS_NONE;
> -
> - for (i = 0; i < 2; i++)
> - {
> - arelent *r;
> -
> - if (idx + 1 >= sec->reloc_count)
> - break;
> - r = sec->orelocation[idx + 1];
> - if (r->address != ptr->address
> - || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
> - || (*r->sym_ptr_ptr)->value != 0)
> - break;
> -
> - /* We can merge the reloc at IDX + 1 with the reloc at IDX. */
> -
> - if (i == 0)
> - int_rel.r_type2 = r->howto->type;
> - else
> - int_rel.r_type3 = r->howto->type;
> -
> - ++idx;
> - }
> -
> - mips_elf64_swap_reloc_out (abfd, &int_rel, ext_rel);
> - }
> -
> - BFD_ASSERT (ext_rel - (Elf64_Mips_External_Rel *) rel_hdr->contents
> - == *count);
> -}
>
> static void
> mips_elf64_write_rela (bfd *abfd, asection *sec,
> @@ -4713,8 +3045,11 @@ const struct elf_size_info mips_elf64_size_info =
> bfd_elf64_slurp_symbol_table,
> bfd_elf64_swap_dyn_in,
> bfd_elf64_swap_dyn_out,
> - mips_elf64_be_swap_reloc_in,
> - mips_elf64_be_swap_reloc_out,
> + /* MIPS ELF SHT_REL actually need to handle chained relocation
> + swap but as we don't use SHT_REL any more just use generic
> + place holder here. */
> + bfd_elf64_swap_reloc_in,
> + bfd_elf64_swap_reloc_out,
> mips_elf64_be_swap_reloca_in,
> mips_elf64_be_swap_reloca_out
> };
> @@ -4729,7 +3064,7 @@ const struct elf_size_info mips_elf64_size_info =
> #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_rela
> +#define elf_info_to_howto_rel NULL
> #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
> @@ -4780,9 +3115,8 @@ const struct elf_size_info mips_elf64_size_info =
> #define elf_backend_got_header_size (8 * MIPS_RESERVED_GOTNO)
> #define elf_backend_want_dynrelro 1
>
> -/* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
> - work better/work only in RELA, so we default to this. */
> -#define elf_backend_may_use_rel_p 1
> +/* We restrict MIPS ELF64 to rela only */
> +#define elf_backend_may_use_rel_p 0
> #define elf_backend_may_use_rela_p 1
> #define elf_backend_default_use_rela_p 1
> #define elf_backend_rela_plts_and_copies_p 0
> diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c
> index da8afa3e57..7da56d23dd 100644
> --- a/bfd/elfn32-mips.c
> +++ b/bfd/elfn32-mips.c
> @@ -66,8 +66,6 @@ static bfd_reloc_status_type mips16_gprel_reloc
> (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
> static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
> (bfd *, bfd_reloc_code_real_type);
> -static bfd_boolean mips_info_to_howto_rel
> - (bfd *, arelent *, Elf_Internal_Rela *);
> static bfd_boolean mips_info_to_howto_rela
> (bfd *, arelent *, Elf_Internal_Rela *);
> static bfd_boolean mips_elf_sym_is_global
> @@ -105,771 +103,6 @@ extern const bfd_target mips_elf32_n_le_vec;
> from smaller values. Start with zero, widen, *then* decrement. */
> #define MINUS_ONE (((bfd_vma)0) - 1)
>
> -/* The relocation table used for SHT_REL sections. */
> -
> -static reloc_howto_type elf_mips_howto_table_rel[] =
> -{
> - /* No relocation. */
> - HOWTO (R_MIPS_NONE, /* type */
> - 0, /* rightshift */
> - 3, /* size (0 = byte, 1 = short, 2 = long) */
> - 0, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_NONE", /* name */
> - FALSE, /* partial_inplace */
> - 0, /* src_mask */
> - 0, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 16 bit relocation. */
> - HOWTO (R_MIPS_16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 32 bit relocation. */
> - HOWTO (R_MIPS_32, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_32", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 32 bit symbol relative relocation. */
> - HOWTO (R_MIPS_REL32, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_REL32", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 26 bit jump address. */
> - HOWTO (R_MIPS_26, /* type */
> - 2, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 26, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - /* This needs complex overflow
> - detection, because the upper four
> - bits must match the PC + 4. */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_26", /* name */
> - TRUE, /* partial_inplace */
> - 0x03ffffff, /* src_mask */
> - 0x03ffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
> - However, the native IRIX6 tools use them, so we try our best. */
> -
> - /* High 16 bits of symbol value. */
> - HOWTO (R_MIPS_HI16, /* type */
> - 16, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_hi16_reloc, /* special_function */
> - "R_MIPS_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Low 16 bits of symbol value. */
> - HOWTO (R_MIPS_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_lo16_reloc, /* special_function */
> - "R_MIPS_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* GP relative reference. */
> - HOWTO (R_MIPS_GPREL16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - mips_elf_gprel16_reloc, /* special_function */
> - "R_MIPS_GPREL16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Reference to literal section. */
> - HOWTO (R_MIPS_LITERAL, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - mips_elf_literal_reloc, /* special_function */
> - "R_MIPS_LITERAL", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Reference to global offset table. */
> - HOWTO (R_MIPS_GOT16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_got16_reloc, /* special_function */
> - "R_MIPS_GOT16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 16 bit PC relative reference. Note that the ABI document has a typo
> - and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
> - We do the right thing here. */
> - HOWTO (R_MIPS_PC16, /* type */
> - 2, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_PC16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - /* 16 bit call through global offset table. */
> - HOWTO (R_MIPS_CALL16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_CALL16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 32 bit GP relative reference. */
> - HOWTO (R_MIPS_GPREL32, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - mips_elf_gprel32_reloc, /* special_function */
> - "R_MIPS_GPREL32", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* The remaining relocs are defined on Irix 5, although they are
> - not defined by the ABI. */
> - EMPTY_HOWTO (13),
> - EMPTY_HOWTO (14),
> - EMPTY_HOWTO (15),
> -
> - /* A 5 bit shift field. */
> - HOWTO (R_MIPS_SHIFT5, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 5, /* bitsize */
> - FALSE, /* pc_relative */
> - 6, /* bitpos */
> - complain_overflow_bitfield, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_SHIFT5", /* name */
> - TRUE, /* partial_inplace */
> - 0x000007c0, /* src_mask */
> - 0x000007c0, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* A 6 bit shift field. */
> - HOWTO (R_MIPS_SHIFT6, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 6, /* bitsize */
> - FALSE, /* pc_relative */
> - 6, /* bitpos */
> - complain_overflow_bitfield, /* complain_on_overflow */
> - mips_elf_shift6_reloc, /* special_function */
> - "R_MIPS_SHIFT6", /* name */
> - TRUE, /* partial_inplace */
> - 0x000007c4, /* src_mask */
> - 0x000007c4, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* A 64 bit relocation. */
> - HOWTO (R_MIPS_64, /* type */
> - 0, /* rightshift */
> - 4, /* size (0 = byte, 1 = short, 2 = long) */
> - 64, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_64", /* name */
> - TRUE, /* partial_inplace */
> - MINUS_ONE, /* src_mask */
> - MINUS_ONE, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Displacement in the global offset table. */
> - HOWTO (R_MIPS_GOT_DISP, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_GOT_DISP", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Displacement to page pointer in the global offset table. */
> - HOWTO (R_MIPS_GOT_PAGE, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_GOT_PAGE", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Offset from page pointer in the global offset table. */
> - HOWTO (R_MIPS_GOT_OFST, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_GOT_OFST", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* High 16 bits of displacement in global offset table. */
> - HOWTO (R_MIPS_GOT_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_GOT_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Low 16 bits of displacement in global offset table. */
> - HOWTO (R_MIPS_GOT_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_GOT_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 64 bit subtraction. */
> - HOWTO (R_MIPS_SUB, /* type */
> - 0, /* rightshift */
> - 4, /* size (0 = byte, 1 = short, 2 = long) */
> - 64, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_SUB", /* name */
> - TRUE, /* partial_inplace */
> - MINUS_ONE, /* src_mask */
> - MINUS_ONE, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Insert the addend as an instruction. */
> - /* FIXME: Not handled correctly. */
> - HOWTO (R_MIPS_INSERT_A, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_INSERT_A", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Insert the addend as an instruction, and change all relocations
> - to refer to the old instruction at the address. */
> - /* FIXME: Not handled correctly. */
> - HOWTO (R_MIPS_INSERT_B, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_INSERT_B", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Delete a 32 bit instruction. */
> - /* FIXME: Not handled correctly. */
> - HOWTO (R_MIPS_DELETE, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_DELETE", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
> - We don't, because
> - a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
> - R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
> - fallable heuristics.
> - b) No other NewABI toolchain actually emits such relocations. */
> - EMPTY_HOWTO (R_MIPS_HIGHER),
> - EMPTY_HOWTO (R_MIPS_HIGHEST),
> -
> - /* High 16 bits of displacement in global offset table. */
> - HOWTO (R_MIPS_CALL_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_CALL_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Low 16 bits of displacement in global offset table. */
> - HOWTO (R_MIPS_CALL_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_CALL_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Section displacement. */
> - HOWTO (R_MIPS_SCN_DISP, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_SCN_DISP", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - HOWTO (R_MIPS_REL16, /* type */
> - 0, /* rightshift */
> - 1, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_REL16", /* name */
> - TRUE, /* partial_inplace */
> - 0xffff, /* src_mask */
> - 0xffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* These two are obsolete. */
> - EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
> - EMPTY_HOWTO (R_MIPS_PJUMP),
> -
> - /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
> - It must be used for multigot GOT's (and only there). */
> - HOWTO (R_MIPS_RELGOT, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_RELGOT", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Protected jump conversion. This is an optimization hint. No
> - relocation is required for correctness. */
> - HOWTO (R_MIPS_JALR, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_JALR", /* name */
> - FALSE, /* partial_inplace */
> - 0x00000000, /* src_mask */
> - 0x00000000, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS GD/LD dynamic relocations. */
> - HOWTO (R_MIPS_TLS_DTPMOD32, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_DTPMOD32", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - HOWTO (R_MIPS_TLS_DTPREL32, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_DTPREL32", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
> - EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
> -
> - /* TLS general dynamic variable reference. */
> - HOWTO (R_MIPS_TLS_GD, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_GD", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS local dynamic variable reference. */
> - HOWTO (R_MIPS_TLS_LDM, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_LDM", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS local dynamic offset. */
> - HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_DTPREL_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS local dynamic offset. */
> - HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_DTPREL_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS thread pointer offset. */
> - HOWTO (R_MIPS_TLS_GOTTPREL, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_GOTTPREL", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS IE dynamic relocations. */
> - HOWTO (R_MIPS_TLS_TPREL32, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_TPREL32", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
> -
> - /* TLS thread pointer offset. */
> - HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_TPREL_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS thread pointer offset. */
> - HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_TLS_TPREL_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 32 bit relocation with no addend. */
> - HOWTO (R_MIPS_GLOB_DAT, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_GLOB_DAT", /* name */
> - FALSE, /* partial_inplace */
> - 0x0, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - EMPTY_HOWTO (52),
> - EMPTY_HOWTO (53),
> - EMPTY_HOWTO (54),
> - EMPTY_HOWTO (55),
> - EMPTY_HOWTO (56),
> - EMPTY_HOWTO (57),
> - EMPTY_HOWTO (58),
> - EMPTY_HOWTO (59),
> -
> - HOWTO (R_MIPS_PC21_S2, /* type */
> - 2, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 21, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_PC21_S2", /* name */
> - TRUE, /* partial_inplace */
> - 0x001fffff, /* src_mask */
> - 0x001fffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - HOWTO (R_MIPS_PC26_S2, /* type */
> - 2, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 26, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_PC26_S2", /* name */
> - TRUE, /* partial_inplace */
> - 0x03ffffff, /* src_mask */
> - 0x03ffffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - HOWTO (R_MIPS_PC18_S3, /* type */
> - 3, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 18, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_PC18_S3", /* name */
> - TRUE, /* partial_inplace */
> - 0x0003ffff, /* src_mask */
> - 0x0003ffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - HOWTO (R_MIPS_PC19_S2, /* type */
> - 2, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 19, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_PC19_S2", /* name */
> - TRUE, /* partial_inplace */
> - 0x0007ffff, /* src_mask */
> - 0x0007ffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - HOWTO (R_MIPS_PCHI16, /* type */
> - 16, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_PCHI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - HOWTO (R_MIPS_PCLO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS_PCLO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> -};
> -
> /* The relocation table used for SHT_RELA sections. */
>
> static reloc_howto_type elf_mips_howto_table_rela[] =
> @@ -1652,222 +885,6 @@ static reloc_howto_type elf_mips_howto_table_rela[] =
>
> };
>
> -static reloc_howto_type elf_mips16_howto_table_rel[] =
> -{
> - /* The reloc used for the mips16 jump instruction. */
> - HOWTO (R_MIPS16_26, /* type */
> - 2, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 26, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - /* This needs complex overflow
> - detection, because the upper four
> - bits must match the PC. */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_26", /* name */
> - TRUE, /* partial_inplace */
> - 0x3ffffff, /* src_mask */
> - 0x3ffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* The reloc used for the mips16 gprel instruction. */
> - HOWTO (R_MIPS16_GPREL, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - mips16_gprel_reloc, /* special_function */
> - "R_MIPS16_GPREL", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* A MIPS16 reference to the global offset table. */
> - HOWTO (R_MIPS16_GOT16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_got16_reloc, /* special_function */
> - "R_MIPS16_GOT16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* A MIPS16 call through the global offset table. */
> - HOWTO (R_MIPS16_CALL16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_CALL16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 high 16 bits of symbol value. */
> - HOWTO (R_MIPS16_HI16, /* type */
> - 16, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_hi16_reloc, /* special_function */
> - "R_MIPS16_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 low 16 bits of symbol value. */
> - HOWTO (R_MIPS16_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_lo16_reloc, /* special_function */
> - "R_MIPS16_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 TLS general dynamic variable reference. */
> - HOWTO (R_MIPS16_TLS_GD, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_TLS_GD", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 TLS local dynamic variable reference. */
> - HOWTO (R_MIPS16_TLS_LDM, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_TLS_LDM", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 TLS local dynamic offset. */
> - HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_TLS_DTPREL_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 TLS local dynamic offset. */
> - HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_TLS_DTPREL_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 TLS thread pointer offset. */
> - HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_TLS_GOTTPREL", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 TLS thread pointer offset. */
> - HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_TLS_TPREL_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 TLS thread pointer offset. */
> - HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_TLS_TPREL_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* MIPS16 16-bit PC-relative branch offset. */
> - HOWTO (R_MIPS16_PC16_S1, /* type */
> - 1, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MIPS16_PC16_S1", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -};
> -
> static reloc_howto_type elf_mips16_howto_table_rela[] =
> {
> /* The reloc used for the mips16 jump instruction. */
> @@ -2084,485 +1101,6 @@ static reloc_howto_type elf_mips16_howto_table_rela[] =
> TRUE), /* pcrel_offset */
> };
>
> -static reloc_howto_type elf_micromips_howto_table_rel[] =
> -{
> - EMPTY_HOWTO (130),
> - EMPTY_HOWTO (131),
> - EMPTY_HOWTO (132),
> -
> - /* 26 bit jump address. */
> - HOWTO (R_MICROMIPS_26_S1, /* type */
> - 1, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 26, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - /* This needs complex overflow
> - detection, because the upper four
> - bits must match the PC. */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_26_S1", /* name */
> - TRUE, /* partial_inplace */
> - 0x3ffffff, /* src_mask */
> - 0x3ffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* High 16 bits of symbol value. */
> - HOWTO (R_MICROMIPS_HI16, /* type */
> - 16, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_hi16_reloc, /* special_function */
> - "R_MICROMIPS_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Low 16 bits of symbol value. */
> - HOWTO (R_MICROMIPS_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_lo16_reloc, /* special_function */
> - "R_MICROMIPS_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* GP relative reference. */
> - HOWTO (R_MICROMIPS_GPREL16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf32_gprel16_reloc, /* special_function */
> - "R_MICROMIPS_GPREL16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Reference to literal section. */
> - HOWTO (R_MICROMIPS_LITERAL, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf32_gprel16_reloc, /* special_function */
> - "R_MICROMIPS_LITERAL", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Reference to global offset table. */
> - HOWTO (R_MICROMIPS_GOT16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_got16_reloc, /* special_function */
> - "R_MICROMIPS_GOT16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* This is for microMIPS branches. */
> - HOWTO (R_MICROMIPS_PC7_S1, /* type */
> - 1, /* rightshift */
> - 1, /* size (0 = byte, 1 = short, 2 = long) */
> - 7, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_PC7_S1", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000007f, /* src_mask */
> - 0x0000007f, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - HOWTO (R_MICROMIPS_PC10_S1, /* type */
> - 1, /* rightshift */
> - 1, /* size (0 = byte, 1 = short, 2 = long) */
> - 10, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_PC10_S1", /* name */
> - TRUE, /* partial_inplace */
> - 0x000003ff, /* src_mask */
> - 0x000003ff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - HOWTO (R_MICROMIPS_PC16_S1, /* type */
> - 1, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_PC16_S1", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -
> - /* 16 bit call through global offset table. */
> - HOWTO (R_MICROMIPS_CALL16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_CALL16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - EMPTY_HOWTO (143),
> - EMPTY_HOWTO (144),
> -
> - /* Displacement in the global offset table. */
> - HOWTO (R_MICROMIPS_GOT_DISP, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_GOT_DISP",/* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Displacement to page pointer in the global offset table. */
> - HOWTO (R_MICROMIPS_GOT_PAGE, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_GOT_PAGE",/* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Offset from page pointer in the global offset table. */
> - HOWTO (R_MICROMIPS_GOT_OFST, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_GOT_OFST",/* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* High 16 bits of displacement in global offset table. */
> - HOWTO (R_MICROMIPS_GOT_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_GOT_HI16",/* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Low 16 bits of displacement in global offset table. */
> - HOWTO (R_MICROMIPS_GOT_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_GOT_LO16",/* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* 64 bit subtraction. Used in the N32 ABI. */
> - HOWTO (R_MICROMIPS_SUB, /* type */
> - 0, /* rightshift */
> - 4, /* size (0 = byte, 1 = short, 2 = long) */
> - 64, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_SUB", /* name */
> - TRUE, /* partial_inplace */
> - MINUS_ONE, /* src_mask */
> - MINUS_ONE, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* We don't support these for REL relocations, because it means building
> - the addend from a R_MICROMIPS_HIGHEST/R_MICROMIPS_HIGHER/
> - R_MICROMIPS_HI16/R_MICROMIPS_LO16 sequence with varying ordering,
> - using fallable heuristics. */
> - EMPTY_HOWTO (R_MICROMIPS_HIGHER),
> - EMPTY_HOWTO (R_MICROMIPS_HIGHEST),
> -
> - /* High 16 bits of displacement in global offset table. */
> - HOWTO (R_MICROMIPS_CALL_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_CALL_HI16",/* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Low 16 bits of displacement in global offset table. */
> - HOWTO (R_MICROMIPS_CALL_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_CALL_LO16",/* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Section displacement. */
> - HOWTO (R_MICROMIPS_SCN_DISP, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_SCN_DISP", /* name */
> - TRUE, /* partial_inplace */
> - 0xffffffff, /* src_mask */
> - 0xffffffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Protected jump conversion. This is an optimization hint. No
> - relocation is required for correctness. */
> - HOWTO (R_MICROMIPS_JALR, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 32, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_JALR", /* name */
> - FALSE, /* partial_inplace */
> - 0, /* src_mask */
> - 0x00000000, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* Low 16 bits of symbol value. Note that the high 16 bits of symbol values
> - must be zero. This is used for relaxation. */
> - HOWTO (R_MICROMIPS_HI0_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_dont, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_HI0_LO16",/* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - EMPTY_HOWTO (158),
> - EMPTY_HOWTO (159),
> - EMPTY_HOWTO (160),
> - EMPTY_HOWTO (161),
> -
> - /* TLS general dynamic variable reference. */
> - HOWTO (R_MICROMIPS_TLS_GD, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_TLS_GD", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS local dynamic variable reference. */
> - HOWTO (R_MICROMIPS_TLS_LDM, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_TLS_LDM", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS local dynamic offset. */
> - HOWTO (R_MICROMIPS_TLS_DTPREL_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_TLS_DTPREL_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS local dynamic offset. */
> - HOWTO (R_MICROMIPS_TLS_DTPREL_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_TLS_DTPREL_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS thread pointer offset. */
> - HOWTO (R_MICROMIPS_TLS_GOTTPREL, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_TLS_GOTTPREL", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - EMPTY_HOWTO (167),
> - EMPTY_HOWTO (168),
> -
> - /* TLS thread pointer offset. */
> - HOWTO (R_MICROMIPS_TLS_TPREL_HI16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_TLS_TPREL_HI16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - /* TLS thread pointer offset. */
> - HOWTO (R_MICROMIPS_TLS_TPREL_LO16, /* type */
> - 0, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 16, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_TLS_TPREL_LO16", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000ffff, /* src_mask */
> - 0x0000ffff, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - EMPTY_HOWTO (171),
> -
> - /* GP- and PC-relative relocations. */
> - HOWTO (R_MICROMIPS_GPREL7_S2, /* type */
> - 2, /* rightshift */
> - 1, /* size (0 = byte, 1 = short, 2 = long) */
> - 7, /* bitsize */
> - FALSE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf32_gprel16_reloc, /* special_function */
> - "R_MICROMIPS_GPREL7_S2", /* name */
> - TRUE, /* partial_inplace */
> - 0x0000007f, /* src_mask */
> - 0x0000007f, /* dst_mask */
> - FALSE), /* pcrel_offset */
> -
> - HOWTO (R_MICROMIPS_PC23_S2, /* type */
> - 2, /* rightshift */
> - 2, /* size (0 = byte, 1 = short, 2 = long) */
> - 23, /* bitsize */
> - TRUE, /* pc_relative */
> - 0, /* bitpos */
> - complain_overflow_signed, /* complain_on_overflow */
> - _bfd_mips_elf_generic_reloc, /* special_function */
> - "R_MICROMIPS_PC23_S2", /* name */
> - TRUE, /* partial_inplace */
> - 0x007fffff, /* src_mask */
> - 0x007fffff, /* dst_mask */
> - TRUE), /* pcrel_offset */
> -};
> -
> static reloc_howto_type elf_micromips_howto_table_rela[] =
> {
> EMPTY_HOWTO (130),
> @@ -3748,10 +2286,7 @@ mips_elf_n32_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p)
> case R_MIPS_GNU_VTENTRY:
> return &elf_mips_gnu_vtentry_howto;
> case R_MIPS_GNU_REL16_S2:
> - if (rela_p)
> - return &elf_mips_gnu_rela16_s2;
> - else
> - return &elf_mips_gnu_rel16_s2;
> + return &elf_mips_gnu_rela16_s2;
> case R_MIPS_PC32:
> return &elf_mips_gnu_pcrel32;
> case R_MIPS_EH:
> @@ -3763,24 +2298,15 @@ mips_elf_n32_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p)
> default:
> if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
> {
> - if (rela_p)
> - howto = &elf_micromips_howto_table_rela[r_type - R_MICROMIPS_min];
> - else
> - howto = &elf_micromips_howto_table_rel[r_type - R_MICROMIPS_min];
> + howto = &elf_micromips_howto_table_rela[r_type - R_MICROMIPS_min];
> }
> if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
> {
> - if (rela_p)
> - howto = &elf_mips16_howto_table_rela[r_type - R_MIPS16_min];
> - else
> - howto = &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
> + howto = &elf_mips16_howto_table_rela[r_type - R_MIPS16_min];
> }
> if (r_type < R_MIPS_max)
> {
> - if (rela_p)
> - howto = &elf_mips_howto_table_rela[r_type];
> - else
> - howto = &elf_mips_howto_table_rel[r_type];
> + howto = &elf_mips_howto_table_rela[r_type];
> }
> if (howto != NULL && howto->name != NULL)
> return howto;
> @@ -3792,30 +2318,6 @@ mips_elf_n32_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p)
> }
> }
>
> -/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */
> -
> -static bfd_boolean
> -mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
> -{
> - unsigned int r_type;
> -
> - r_type = ELF32_R_TYPE (dst->r_info);
> - cache_ptr->howto = mips_elf_n32_rtype_to_howto (abfd, r_type, FALSE);
> -
> - if (cache_ptr->howto == NULL)
> - return FALSE;
> -
> - /* The addend for a GPREL16 or LITERAL relocation comes from the GP
> - value for the object file. We get the addend now, rather than
> - when we do the relocation, because the symbol manipulations done
> - by the linker may cause us to lose track of the input BFD. */
> - if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
> - && (gprel16_reloc_p (r_type) || r_type == (unsigned int) R_MIPS_LITERAL))
> - cache_ptr->addend = elf_gp (abfd);
> -
> - return TRUE;
> -}
> -
> /* Given a MIPS Elf_Internal_Rela, fill in an arelent structure. */
>
> static bfd_boolean
> @@ -4107,7 +2609,7 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
> #define elf_backend_gc_mark_extra_sections \
> _bfd_mips_elf_gc_mark_extra_sections
> #define elf_info_to_howto mips_info_to_howto_rela
> -#define elf_info_to_howto_rel mips_info_to_howto_rel
> +#define elf_info_to_howto_rel NULL
> #define elf_backend_sym_is_global mips_elf_sym_is_global
> #define elf_backend_object_p mips_elf_n32_object_p
> #define elf_backend_symbol_processing _bfd_mips_elf_symbol_processing
> @@ -4156,9 +2658,8 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
> #define elf_backend_got_header_size (4 * MIPS_RESERVED_GOTNO)
> #define elf_backend_want_dynrelro 1
>
> -/* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations
> - work better/work only in RELA, so we default to this. */
> -#define elf_backend_may_use_rel_p 1
> +/* We restrict MIPS ELFn32 to rela only */
> +#define elf_backend_may_use_rel_p 0
> #define elf_backend_may_use_rela_p 1
> #define elf_backend_default_use_rela_p 1
> #define elf_backend_rela_plts_and_copies_p 0
> --
> 2.30.2
>
--
YunQiang Su
More information about the Binutils
mailing list