[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
> -             = &micromips_elf64_howto_table_rela[r_type - R_MICROMIPS_min];
> -         else
> -           howto
> -             = &micromips_elf64_howto_table_rel[r_type - R_MICROMIPS_min];
> +         howto = &micromips_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