Home | History | Annotate | Line # | Download | only in bfd
elfn32-mips.c revision 1.1
      1 /* MIPS-specific support for 32-bit ELF
      2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
      3    2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
      4 
      5    Most of the information added by Ian Lance Taylor, Cygnus Support,
      6    <ian (at) cygnus.com>.
      7    N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
      8    <mark (at) codesourcery.com>
      9    Traditional MIPS targets support added by Koundinya.K, Dansk Data
     10    Elektronik & Operations Research Group. <kk (at) ddeorg.soft.net>
     11 
     12    This file is part of BFD, the Binary File Descriptor library.
     13 
     14    This program is free software; you can redistribute it and/or modify
     15    it under the terms of the GNU General Public License as published by
     16    the Free Software Foundation; either version 3 of the License, or
     17    (at your option) any later version.
     18 
     19    This program is distributed in the hope that it will be useful,
     20    but WITHOUT ANY WARRANTY; without even the implied warranty of
     21    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     22    GNU General Public License for more details.
     23 
     24    You should have received a copy of the GNU General Public License
     25    along with this program; if not, write to the Free Software
     26    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     27    MA 02110-1301, USA.  */
     28 
     29 
     30 /* This file handles MIPS ELF targets.  SGI Irix 5 uses a slightly
     31    different MIPS ELF from other targets.  This matters when linking.
     32    This file supports both, switching at runtime.  */
     33 
     34 #include "sysdep.h"
     35 #include "bfd.h"
     36 #include "libbfd.h"
     37 #include "bfdlink.h"
     38 #include "genlink.h"
     39 #include "elf-bfd.h"
     40 #include "elfxx-mips.h"
     41 #include "elf/mips.h"
     42 
     43 /* Get the ECOFF swapping routines.  */
     44 #include "coff/sym.h"
     45 #include "coff/symconst.h"
     46 #include "coff/internal.h"
     47 #include "coff/ecoff.h"
     48 #include "coff/mips.h"
     49 #define ECOFF_SIGNED_32
     50 #include "ecoffswap.h"
     51 
     52 static bfd_boolean mips_elf_assign_gp
     53   (bfd *, bfd_vma *);
     54 static bfd_reloc_status_type mips_elf_final_gp
     55   (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
     56 static bfd_reloc_status_type mips_elf_gprel16_reloc
     57   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     58 static bfd_reloc_status_type mips_elf_literal_reloc
     59   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     60 static bfd_reloc_status_type mips_elf_gprel32_reloc
     61   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     62 static bfd_reloc_status_type gprel32_with_gp
     63   (bfd *, asymbol *, arelent *, asection *, bfd_boolean, void *, bfd_vma);
     64 static bfd_reloc_status_type mips_elf_shift6_reloc
     65   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     66 static bfd_reloc_status_type mips16_gprel_reloc
     67   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     68 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
     69   (bfd *, bfd_reloc_code_real_type);
     70 static reloc_howto_type *mips_elf_n32_rtype_to_howto
     71   (unsigned int, bfd_boolean);
     72 static void mips_info_to_howto_rel
     73   (bfd *, arelent *, Elf_Internal_Rela *);
     74 static void mips_info_to_howto_rela
     75   (bfd *, arelent *, Elf_Internal_Rela *);
     76 static bfd_boolean mips_elf_sym_is_global
     77   (bfd *, asymbol *);
     78 static bfd_boolean mips_elf_n32_object_p
     79   (bfd *);
     80 static bfd_boolean elf32_mips_grok_prstatus
     81   (bfd *, Elf_Internal_Note *);
     82 static bfd_boolean elf32_mips_grok_psinfo
     83   (bfd *, Elf_Internal_Note *);
     84 static irix_compat_t elf_n32_mips_irix_compat
     85   (bfd *);
     86 
     87 extern const bfd_target bfd_elf32_nbigmips_vec;
     88 extern const bfd_target bfd_elf32_nlittlemips_vec;
     89 
     90 /* Nonzero if ABFD is using the N32 ABI.  */
     91 #define ABI_N32_P(abfd) \
     92   ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
     93 
     94 /* Whether we are trying to be compatible with IRIX at all.  */
     95 #define SGI_COMPAT(abfd) \
     96   (elf_n32_mips_irix_compat (abfd) != ict_none)
     97 
     98 /* The number of local .got entries we reserve.  */
     99 #define MIPS_RESERVED_GOTNO (2)
    100 
    101 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
    102    from smaller values.  Start with zero, widen, *then* decrement.  */
    103 #define MINUS_ONE	(((bfd_vma)0) - 1)
    104 
    105 /* The relocation table used for SHT_REL sections.  */
    106 
    107 static reloc_howto_type elf_mips_howto_table_rel[] =
    108 {
    109   /* No relocation.  */
    110   HOWTO (R_MIPS_NONE,		/* type */
    111 	 0,			/* rightshift */
    112 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    113 	 0,			/* bitsize */
    114 	 FALSE,			/* pc_relative */
    115 	 0,			/* bitpos */
    116 	 complain_overflow_dont, /* complain_on_overflow */
    117 	 _bfd_mips_elf_generic_reloc, /* special_function */
    118 	 "R_MIPS_NONE",		/* name */
    119 	 FALSE,			/* partial_inplace */
    120 	 0,			/* src_mask */
    121 	 0,			/* dst_mask */
    122 	 FALSE),		/* pcrel_offset */
    123 
    124   /* 16 bit relocation.  */
    125   HOWTO (R_MIPS_16,		/* type */
    126 	 0,			/* rightshift */
    127 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    128 	 16,			/* bitsize */
    129 	 FALSE,			/* pc_relative */
    130 	 0,			/* bitpos */
    131 	 complain_overflow_signed, /* complain_on_overflow */
    132 	 _bfd_mips_elf_generic_reloc, /* special_function */
    133 	 "R_MIPS_16",		/* name */
    134 	 TRUE,			/* partial_inplace */
    135 	 0x0000ffff,		/* src_mask */
    136 	 0x0000ffff,		/* dst_mask */
    137 	 FALSE),		/* pcrel_offset */
    138 
    139   /* 32 bit relocation.  */
    140   HOWTO (R_MIPS_32,		/* type */
    141 	 0,			/* rightshift */
    142 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    143 	 32,			/* bitsize */
    144 	 FALSE,			/* pc_relative */
    145 	 0,			/* bitpos */
    146 	 complain_overflow_dont, /* complain_on_overflow */
    147 	 _bfd_mips_elf_generic_reloc, /* special_function */
    148 	 "R_MIPS_32",		/* name */
    149 	 TRUE,			/* partial_inplace */
    150 	 0xffffffff,		/* src_mask */
    151 	 0xffffffff,		/* dst_mask */
    152 	 FALSE),		/* pcrel_offset */
    153 
    154   /* 32 bit symbol relative relocation.  */
    155   HOWTO (R_MIPS_REL32,		/* type */
    156 	 0,			/* rightshift */
    157 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    158 	 32,			/* bitsize */
    159 	 FALSE,			/* pc_relative */
    160 	 0,			/* bitpos */
    161 	 complain_overflow_dont, /* complain_on_overflow */
    162 	 _bfd_mips_elf_generic_reloc, /* special_function */
    163 	 "R_MIPS_REL32",	/* name */
    164 	 TRUE,			/* partial_inplace */
    165 	 0xffffffff,		/* src_mask */
    166 	 0xffffffff,		/* dst_mask */
    167 	 FALSE),		/* pcrel_offset */
    168 
    169   /* 26 bit jump address.  */
    170   HOWTO (R_MIPS_26,		/* type */
    171 	 2,			/* rightshift */
    172 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    173 	 26,			/* bitsize */
    174 	 FALSE,			/* pc_relative */
    175 	 0,			/* bitpos */
    176 	 complain_overflow_dont, /* complain_on_overflow */
    177 	 			/* This needs complex overflow
    178 				   detection, because the upper four
    179 				   bits must match the PC + 4.  */
    180 	 _bfd_mips_elf_generic_reloc, /* special_function */
    181 	 "R_MIPS_26",		/* name */
    182 	 TRUE,			/* partial_inplace */
    183 	 0x03ffffff,		/* src_mask */
    184 	 0x03ffffff,		/* dst_mask */
    185 	 FALSE),		/* pcrel_offset */
    186 
    187   /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
    188      However, the native IRIX6 tools use them, so we try our best. */
    189 
    190   /* High 16 bits of symbol value.  */
    191   HOWTO (R_MIPS_HI16,		/* type */
    192 	 16,			/* rightshift */
    193 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    194 	 16,			/* bitsize */
    195 	 FALSE,			/* pc_relative */
    196 	 0,			/* bitpos */
    197 	 complain_overflow_dont, /* complain_on_overflow */
    198 	 _bfd_mips_elf_hi16_reloc, /* special_function */
    199 	 "R_MIPS_HI16",		/* name */
    200 	 TRUE,			/* partial_inplace */
    201 	 0x0000ffff,		/* src_mask */
    202 	 0x0000ffff,		/* dst_mask */
    203 	 FALSE),		/* pcrel_offset */
    204 
    205   /* Low 16 bits of symbol value.  */
    206   HOWTO (R_MIPS_LO16,		/* type */
    207 	 0,			/* rightshift */
    208 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    209 	 16,			/* bitsize */
    210 	 FALSE,			/* pc_relative */
    211 	 0,			/* bitpos */
    212 	 complain_overflow_dont, /* complain_on_overflow */
    213 	 _bfd_mips_elf_lo16_reloc, /* special_function */
    214 	 "R_MIPS_LO16",		/* name */
    215 	 TRUE,			/* partial_inplace */
    216 	 0x0000ffff,		/* src_mask */
    217 	 0x0000ffff,		/* dst_mask */
    218 	 FALSE),		/* pcrel_offset */
    219 
    220   /* GP relative reference.  */
    221   HOWTO (R_MIPS_GPREL16,	/* type */
    222 	 0,			/* rightshift */
    223 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    224 	 16,			/* bitsize */
    225 	 FALSE,			/* pc_relative */
    226 	 0,			/* bitpos */
    227 	 complain_overflow_signed, /* complain_on_overflow */
    228 	 mips_elf_gprel16_reloc, /* special_function */
    229 	 "R_MIPS_GPREL16",	/* name */
    230 	 TRUE,			/* partial_inplace */
    231 	 0x0000ffff,		/* src_mask */
    232 	 0x0000ffff,		/* dst_mask */
    233 	 FALSE),		/* pcrel_offset */
    234 
    235   /* Reference to literal section.  */
    236   HOWTO (R_MIPS_LITERAL,	/* type */
    237 	 0,			/* rightshift */
    238 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    239 	 16,			/* bitsize */
    240 	 FALSE,			/* pc_relative */
    241 	 0,			/* bitpos */
    242 	 complain_overflow_signed, /* complain_on_overflow */
    243 	 mips_elf_literal_reloc, /* special_function */
    244 	 "R_MIPS_LITERAL",	/* name */
    245 	 TRUE,			/* partial_inplace */
    246 	 0x0000ffff,		/* src_mask */
    247 	 0x0000ffff,		/* dst_mask */
    248 	 FALSE),		/* pcrel_offset */
    249 
    250   /* Reference to global offset table.  */
    251   HOWTO (R_MIPS_GOT16,		/* type */
    252 	 0,			/* rightshift */
    253 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    254 	 16,			/* bitsize */
    255 	 FALSE,			/* pc_relative */
    256 	 0,			/* bitpos */
    257 	 complain_overflow_signed, /* complain_on_overflow */
    258 	 _bfd_mips_elf_got16_reloc, /* special_function */
    259 	 "R_MIPS_GOT16",	/* name */
    260 	 TRUE,			/* partial_inplace */
    261 	 0x0000ffff,		/* src_mask */
    262 	 0x0000ffff,		/* dst_mask */
    263 	 FALSE),		/* pcrel_offset */
    264 
    265   /* 16 bit PC relative reference.  Note that the ABI document has a typo
    266      and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
    267      We do the right thing here.  */
    268   HOWTO (R_MIPS_PC16,		/* type */
    269 	 2,			/* rightshift */
    270 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    271 	 16,			/* bitsize */
    272 	 TRUE,			/* pc_relative */
    273 	 0,			/* bitpos */
    274 	 complain_overflow_signed, /* complain_on_overflow */
    275 	 _bfd_mips_elf_generic_reloc, /* special_function */
    276 	 "R_MIPS_PC16",		/* name */
    277 	 TRUE,			/* partial_inplace */
    278 	 0x0000ffff,		/* src_mask */
    279 	 0x0000ffff,		/* dst_mask */
    280 	 TRUE),			/* pcrel_offset */
    281 
    282   /* 16 bit call through global offset table.  */
    283   HOWTO (R_MIPS_CALL16,		/* type */
    284 	 0,			/* rightshift */
    285 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    286 	 16,			/* bitsize */
    287 	 FALSE,			/* pc_relative */
    288 	 0,			/* bitpos */
    289 	 complain_overflow_signed, /* complain_on_overflow */
    290 	 _bfd_mips_elf_generic_reloc, /* special_function */
    291 	 "R_MIPS_CALL16",	/* name */
    292 	 TRUE,			/* partial_inplace */
    293 	 0x0000ffff,		/* src_mask */
    294 	 0x0000ffff,		/* dst_mask */
    295 	 FALSE),		/* pcrel_offset */
    296 
    297   /* 32 bit GP relative reference.  */
    298   HOWTO (R_MIPS_GPREL32,	/* type */
    299 	 0,			/* rightshift */
    300 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    301 	 32,			/* bitsize */
    302 	 FALSE,			/* pc_relative */
    303 	 0,			/* bitpos */
    304 	 complain_overflow_dont, /* complain_on_overflow */
    305 	 mips_elf_gprel32_reloc, /* special_function */
    306 	 "R_MIPS_GPREL32",	/* name */
    307 	 TRUE,			/* partial_inplace */
    308 	 0xffffffff,		/* src_mask */
    309 	 0xffffffff,		/* dst_mask */
    310 	 FALSE),		/* pcrel_offset */
    311 
    312   /* The remaining relocs are defined on Irix 5, although they are
    313      not defined by the ABI.  */
    314   EMPTY_HOWTO (13),
    315   EMPTY_HOWTO (14),
    316   EMPTY_HOWTO (15),
    317 
    318   /* A 5 bit shift field.  */
    319   HOWTO (R_MIPS_SHIFT5,		/* type */
    320 	 0,			/* rightshift */
    321 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    322 	 5,			/* bitsize */
    323 	 FALSE,			/* pc_relative */
    324 	 6,			/* bitpos */
    325 	 complain_overflow_bitfield, /* complain_on_overflow */
    326 	 _bfd_mips_elf_generic_reloc, /* special_function */
    327 	 "R_MIPS_SHIFT5",	/* name */
    328 	 TRUE,			/* partial_inplace */
    329 	 0x000007c0,		/* src_mask */
    330 	 0x000007c0,		/* dst_mask */
    331 	 FALSE),		/* pcrel_offset */
    332 
    333   /* A 6 bit shift field.  */
    334   HOWTO (R_MIPS_SHIFT6,		/* type */
    335 	 0,			/* rightshift */
    336 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    337 	 6,			/* bitsize */
    338 	 FALSE,			/* pc_relative */
    339 	 6,			/* bitpos */
    340 	 complain_overflow_bitfield, /* complain_on_overflow */
    341 	 mips_elf_shift6_reloc,	/* special_function */
    342 	 "R_MIPS_SHIFT6",	/* name */
    343 	 TRUE,			/* partial_inplace */
    344 	 0x000007c4,		/* src_mask */
    345 	 0x000007c4,		/* dst_mask */
    346 	 FALSE),		/* pcrel_offset */
    347 
    348   /* A 64 bit relocation.  */
    349   HOWTO (R_MIPS_64,		/* type */
    350 	 0,			/* rightshift */
    351 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    352 	 64,			/* bitsize */
    353 	 FALSE,			/* pc_relative */
    354 	 0,			/* bitpos */
    355 	 complain_overflow_dont, /* complain_on_overflow */
    356 	 _bfd_mips_elf_generic_reloc, /* special_function */
    357 	 "R_MIPS_64",		/* name */
    358 	 TRUE,			/* partial_inplace */
    359 	 MINUS_ONE,		/* src_mask */
    360 	 MINUS_ONE,		/* dst_mask */
    361 	 FALSE),		/* pcrel_offset */
    362 
    363   /* Displacement in the global offset table.  */
    364   HOWTO (R_MIPS_GOT_DISP,	/* type */
    365 	 0,			/* rightshift */
    366 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    367 	 16,			/* bitsize */
    368 	 FALSE,			/* pc_relative */
    369 	 0,			/* bitpos */
    370 	 complain_overflow_signed, /* complain_on_overflow */
    371 	 _bfd_mips_elf_generic_reloc, /* special_function */
    372 	 "R_MIPS_GOT_DISP",	/* name */
    373 	 TRUE,			/* partial_inplace */
    374 	 0x0000ffff,		/* src_mask */
    375 	 0x0000ffff,		/* dst_mask */
    376 	 FALSE),		/* pcrel_offset */
    377 
    378   /* Displacement to page pointer in the global offset table.  */
    379   HOWTO (R_MIPS_GOT_PAGE,	/* type */
    380 	 0,			/* rightshift */
    381 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    382 	 16,			/* bitsize */
    383 	 FALSE,			/* pc_relative */
    384 	 0,			/* bitpos */
    385 	 complain_overflow_signed, /* complain_on_overflow */
    386 	 _bfd_mips_elf_generic_reloc, /* special_function */
    387 	 "R_MIPS_GOT_PAGE",	/* name */
    388 	 TRUE,			/* partial_inplace */
    389 	 0x0000ffff,		/* src_mask */
    390 	 0x0000ffff,		/* dst_mask */
    391 	 FALSE),		/* pcrel_offset */
    392 
    393   /* Offset from page pointer in the global offset table.  */
    394   HOWTO (R_MIPS_GOT_OFST,	/* type */
    395 	 0,			/* rightshift */
    396 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    397 	 16,			/* bitsize */
    398 	 FALSE,			/* pc_relative */
    399 	 0,			/* bitpos */
    400 	 complain_overflow_signed, /* complain_on_overflow */
    401 	 _bfd_mips_elf_generic_reloc, /* special_function */
    402 	 "R_MIPS_GOT_OFST",	/* name */
    403 	 TRUE,			/* partial_inplace */
    404 	 0x0000ffff,		/* src_mask */
    405 	 0x0000ffff,		/* dst_mask */
    406 	 FALSE),		/* pcrel_offset */
    407 
    408   /* High 16 bits of displacement in global offset table.  */
    409   HOWTO (R_MIPS_GOT_HI16,	/* type */
    410 	 0,			/* rightshift */
    411 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    412 	 16,			/* bitsize */
    413 	 FALSE,			/* pc_relative */
    414 	 0,			/* bitpos */
    415 	 complain_overflow_dont, /* complain_on_overflow */
    416 	 _bfd_mips_elf_generic_reloc, /* special_function */
    417 	 "R_MIPS_GOT_HI16",	/* name */
    418 	 TRUE,			/* partial_inplace */
    419 	 0x0000ffff,		/* src_mask */
    420 	 0x0000ffff,		/* dst_mask */
    421 	 FALSE),		/* pcrel_offset */
    422 
    423   /* Low 16 bits of displacement in global offset table.  */
    424   HOWTO (R_MIPS_GOT_LO16,	/* type */
    425 	 0,			/* rightshift */
    426 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    427 	 16,			/* bitsize */
    428 	 FALSE,			/* pc_relative */
    429 	 0,			/* bitpos */
    430 	 complain_overflow_dont, /* complain_on_overflow */
    431 	 _bfd_mips_elf_generic_reloc, /* special_function */
    432 	 "R_MIPS_GOT_LO16",	/* name */
    433 	 TRUE,			/* partial_inplace */
    434 	 0x0000ffff,		/* src_mask */
    435 	 0x0000ffff,		/* dst_mask */
    436 	 FALSE),		/* pcrel_offset */
    437 
    438   /* 64 bit subtraction.  */
    439   HOWTO (R_MIPS_SUB,		/* type */
    440 	 0,			/* rightshift */
    441 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    442 	 64,			/* bitsize */
    443 	 FALSE,			/* pc_relative */
    444 	 0,			/* bitpos */
    445 	 complain_overflow_dont, /* complain_on_overflow */
    446 	 _bfd_mips_elf_generic_reloc, /* special_function */
    447 	 "R_MIPS_SUB",		/* name */
    448 	 TRUE,			/* partial_inplace */
    449 	 MINUS_ONE,		/* src_mask */
    450 	 MINUS_ONE,		/* dst_mask */
    451 	 FALSE),		/* pcrel_offset */
    452 
    453   /* Insert the addend as an instruction.  */
    454   /* FIXME: Not handled correctly.  */
    455   HOWTO (R_MIPS_INSERT_A,	/* type */
    456 	 0,			/* rightshift */
    457 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    458 	 32,			/* bitsize */
    459 	 FALSE,			/* pc_relative */
    460 	 0,			/* bitpos */
    461 	 complain_overflow_dont, /* complain_on_overflow */
    462 	 _bfd_mips_elf_generic_reloc, /* special_function */
    463 	 "R_MIPS_INSERT_A",	/* name */
    464 	 TRUE,			/* partial_inplace */
    465 	 0xffffffff,		/* src_mask */
    466 	 0xffffffff,		/* dst_mask */
    467 	 FALSE),		/* pcrel_offset */
    468 
    469   /* Insert the addend as an instruction, and change all relocations
    470      to refer to the old instruction at the address.  */
    471   /* FIXME: Not handled correctly.  */
    472   HOWTO (R_MIPS_INSERT_B,	/* type */
    473 	 0,			/* rightshift */
    474 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    475 	 32,			/* bitsize */
    476 	 FALSE,			/* pc_relative */
    477 	 0,			/* bitpos */
    478 	 complain_overflow_dont, /* complain_on_overflow */
    479 	 _bfd_mips_elf_generic_reloc, /* special_function */
    480 	 "R_MIPS_INSERT_B",	/* name */
    481 	 TRUE,			/* partial_inplace */
    482 	 0xffffffff,		/* src_mask */
    483 	 0xffffffff,		/* dst_mask */
    484 	 FALSE),		/* pcrel_offset */
    485 
    486   /* Delete a 32 bit instruction.  */
    487   /* FIXME: Not handled correctly.  */
    488   HOWTO (R_MIPS_DELETE,		/* type */
    489 	 0,			/* rightshift */
    490 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    491 	 32,			/* bitsize */
    492 	 FALSE,			/* pc_relative */
    493 	 0,			/* bitpos */
    494 	 complain_overflow_dont, /* complain_on_overflow */
    495 	 _bfd_mips_elf_generic_reloc, /* special_function */
    496 	 "R_MIPS_DELETE",	/* name */
    497 	 TRUE,			/* partial_inplace */
    498 	 0xffffffff,		/* src_mask */
    499 	 0xffffffff,		/* dst_mask */
    500 	 FALSE),		/* pcrel_offset */
    501 
    502   /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
    503      We don't, because
    504        a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
    505 	  R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
    506 	  fallable heuristics.
    507        b) No other NewABI toolchain actually emits such relocations.  */
    508   EMPTY_HOWTO (R_MIPS_HIGHER),
    509   EMPTY_HOWTO (R_MIPS_HIGHEST),
    510 
    511   /* High 16 bits of displacement in global offset table.  */
    512   HOWTO (R_MIPS_CALL_HI16,	/* type */
    513 	 0,			/* rightshift */
    514 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    515 	 16,			/* bitsize */
    516 	 FALSE,			/* pc_relative */
    517 	 0,			/* bitpos */
    518 	 complain_overflow_dont, /* complain_on_overflow */
    519 	 _bfd_mips_elf_generic_reloc, /* special_function */
    520 	 "R_MIPS_CALL_HI16",	/* name */
    521 	 TRUE,			/* partial_inplace */
    522 	 0x0000ffff,		/* src_mask */
    523 	 0x0000ffff,		/* dst_mask */
    524 	 FALSE),		/* pcrel_offset */
    525 
    526   /* Low 16 bits of displacement in global offset table.  */
    527   HOWTO (R_MIPS_CALL_LO16,	/* type */
    528 	 0,			/* rightshift */
    529 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    530 	 16,			/* bitsize */
    531 	 FALSE,			/* pc_relative */
    532 	 0,			/* bitpos */
    533 	 complain_overflow_dont, /* complain_on_overflow */
    534 	 _bfd_mips_elf_generic_reloc, /* special_function */
    535 	 "R_MIPS_CALL_LO16",	/* name */
    536 	 TRUE,			/* partial_inplace */
    537 	 0x0000ffff,		/* src_mask */
    538 	 0x0000ffff,		/* dst_mask */
    539 	 FALSE),		/* pcrel_offset */
    540 
    541   /* Section displacement.  */
    542   HOWTO (R_MIPS_SCN_DISP,       /* type */
    543 	 0,			/* rightshift */
    544 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    545 	 32,			/* bitsize */
    546 	 FALSE,			/* pc_relative */
    547 	 0,			/* bitpos */
    548 	 complain_overflow_dont, /* complain_on_overflow */
    549 	 _bfd_mips_elf_generic_reloc, /* special_function */
    550 	 "R_MIPS_SCN_DISP",     /* name */
    551 	 TRUE,			/* partial_inplace */
    552 	 0xffffffff,		/* src_mask */
    553 	 0xffffffff,		/* dst_mask */
    554 	 FALSE),		/* pcrel_offset */
    555 
    556   HOWTO (R_MIPS_REL16,		/* type */
    557 	 0,			/* rightshift */
    558 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    559 	 16,			/* bitsize */
    560 	 FALSE,			/* pc_relative */
    561 	 0,			/* bitpos */
    562 	 complain_overflow_signed, /* complain_on_overflow */
    563 	 _bfd_mips_elf_generic_reloc, /* special_function */
    564 	 "R_MIPS_REL16",	/* name */
    565 	 TRUE,			/* partial_inplace */
    566 	 0xffff,		/* src_mask */
    567 	 0xffff,		/* dst_mask */
    568 	 FALSE),		/* pcrel_offset */
    569 
    570   /* These two are obsolete.  */
    571   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
    572   EMPTY_HOWTO (R_MIPS_PJUMP),
    573 
    574   /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
    575      It must be used for multigot GOT's (and only there).  */
    576   HOWTO (R_MIPS_RELGOT,		/* type */
    577 	 0,			/* rightshift */
    578 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    579 	 32,			/* bitsize */
    580 	 FALSE,			/* pc_relative */
    581 	 0,			/* bitpos */
    582 	 complain_overflow_dont, /* complain_on_overflow */
    583 	 _bfd_mips_elf_generic_reloc, /* special_function */
    584 	 "R_MIPS_RELGOT",	/* name */
    585 	 TRUE,			/* partial_inplace */
    586 	 0xffffffff,		/* src_mask */
    587 	 0xffffffff,		/* dst_mask */
    588 	 FALSE),		/* pcrel_offset */
    589 
    590   /* Protected jump conversion.  This is an optimization hint.  No
    591      relocation is required for correctness.  */
    592   HOWTO (R_MIPS_JALR,	        /* type */
    593 	 0,			/* rightshift */
    594 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    595 	 32,			/* bitsize */
    596 	 FALSE,			/* pc_relative */
    597 	 0,			/* bitpos */
    598 	 complain_overflow_dont, /* complain_on_overflow */
    599 	 _bfd_mips_elf_generic_reloc, /* special_function */
    600 	 "R_MIPS_JALR",	        /* name */
    601 	 FALSE,			/* partial_inplace */
    602 	 0x00000000,		/* src_mask */
    603 	 0x00000000,		/* dst_mask */
    604 	 FALSE),		/* pcrel_offset */
    605 
    606   /* TLS GD/LD dynamic relocations.  */
    607   HOWTO (R_MIPS_TLS_DTPMOD32,	/* type */
    608 	 0,			/* rightshift */
    609 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    610 	 32,			/* bitsize */
    611 	 FALSE,			/* pc_relative */
    612 	 0,			/* bitpos */
    613 	 complain_overflow_dont, /* complain_on_overflow */
    614 	 _bfd_mips_elf_generic_reloc, /* special_function */
    615 	 "R_MIPS_TLS_DTPMOD32",	/* name */
    616 	 TRUE,			/* partial_inplace */
    617 	 0xffffffff,		/* src_mask */
    618 	 0xffffffff,		/* dst_mask */
    619 	 FALSE),		/* pcrel_offset */
    620 
    621   HOWTO (R_MIPS_TLS_DTPREL32,	/* type */
    622 	 0,			/* rightshift */
    623 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    624 	 32,			/* bitsize */
    625 	 FALSE,			/* pc_relative */
    626 	 0,			/* bitpos */
    627 	 complain_overflow_dont, /* complain_on_overflow */
    628 	 _bfd_mips_elf_generic_reloc, /* special_function */
    629 	 "R_MIPS_TLS_DTPREL32",	/* name */
    630 	 TRUE,			/* partial_inplace */
    631 	 0xffffffff,		/* src_mask */
    632 	 0xffffffff,		/* dst_mask */
    633 	 FALSE),		/* pcrel_offset */
    634 
    635   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
    636   EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
    637 
    638   /* TLS general dynamic variable reference.  */
    639   HOWTO (R_MIPS_TLS_GD,		/* type */
    640 	 0,			/* rightshift */
    641 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    642 	 16,			/* bitsize */
    643 	 FALSE,			/* pc_relative */
    644 	 0,			/* bitpos */
    645 	 complain_overflow_signed, /* complain_on_overflow */
    646 	 _bfd_mips_elf_generic_reloc, /* special_function */
    647 	 "R_MIPS_TLS_GD",	/* name */
    648 	 TRUE,			/* partial_inplace */
    649 	 0x0000ffff,		/* src_mask */
    650 	 0x0000ffff,		/* dst_mask */
    651 	 FALSE),		/* pcrel_offset */
    652 
    653   /* TLS local dynamic variable reference.  */
    654   HOWTO (R_MIPS_TLS_LDM,	/* type */
    655 	 0,			/* rightshift */
    656 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    657 	 16,			/* bitsize */
    658 	 FALSE,			/* pc_relative */
    659 	 0,			/* bitpos */
    660 	 complain_overflow_signed, /* complain_on_overflow */
    661 	 _bfd_mips_elf_generic_reloc, /* special_function */
    662 	 "R_MIPS_TLS_LDM",	/* name */
    663 	 TRUE,			/* partial_inplace */
    664 	 0x0000ffff,		/* src_mask */
    665 	 0x0000ffff,		/* dst_mask */
    666 	 FALSE),		/* pcrel_offset */
    667 
    668   /* TLS local dynamic offset.  */
    669   HOWTO (R_MIPS_TLS_DTPREL_HI16,	/* type */
    670 	 0,			/* rightshift */
    671 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    672 	 16,			/* bitsize */
    673 	 FALSE,			/* pc_relative */
    674 	 0,			/* bitpos */
    675 	 complain_overflow_signed, /* complain_on_overflow */
    676 	 _bfd_mips_elf_generic_reloc, /* special_function */
    677 	 "R_MIPS_TLS_DTPREL_HI16",	/* name */
    678 	 TRUE,			/* partial_inplace */
    679 	 0x0000ffff,		/* src_mask */
    680 	 0x0000ffff,		/* dst_mask */
    681 	 FALSE),		/* pcrel_offset */
    682 
    683   /* TLS local dynamic offset.  */
    684   HOWTO (R_MIPS_TLS_DTPREL_LO16,	/* type */
    685 	 0,			/* rightshift */
    686 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    687 	 16,			/* bitsize */
    688 	 FALSE,			/* pc_relative */
    689 	 0,			/* bitpos */
    690 	 complain_overflow_signed, /* complain_on_overflow */
    691 	 _bfd_mips_elf_generic_reloc, /* special_function */
    692 	 "R_MIPS_TLS_DTPREL_LO16",	/* name */
    693 	 TRUE,			/* partial_inplace */
    694 	 0x0000ffff,		/* src_mask */
    695 	 0x0000ffff,		/* dst_mask */
    696 	 FALSE),		/* pcrel_offset */
    697 
    698   /* TLS thread pointer offset.  */
    699   HOWTO (R_MIPS_TLS_GOTTPREL,	/* type */
    700 	 0,			/* rightshift */
    701 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    702 	 16,			/* bitsize */
    703 	 FALSE,			/* pc_relative */
    704 	 0,			/* bitpos */
    705 	 complain_overflow_signed, /* complain_on_overflow */
    706 	 _bfd_mips_elf_generic_reloc, /* special_function */
    707 	 "R_MIPS_TLS_GOTTPREL",	/* name */
    708 	 TRUE,			/* partial_inplace */
    709 	 0x0000ffff,		/* src_mask */
    710 	 0x0000ffff,		/* dst_mask */
    711 	 FALSE),		/* pcrel_offset */
    712 
    713   /* TLS IE dynamic relocations.  */
    714   HOWTO (R_MIPS_TLS_TPREL32,	/* type */
    715 	 0,			/* rightshift */
    716 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    717 	 32,			/* bitsize */
    718 	 FALSE,			/* pc_relative */
    719 	 0,			/* bitpos */
    720 	 complain_overflow_dont, /* complain_on_overflow */
    721 	 _bfd_mips_elf_generic_reloc, /* special_function */
    722 	 "R_MIPS_TLS_TPREL32",	/* name */
    723 	 TRUE,			/* partial_inplace */
    724 	 0xffffffff,		/* src_mask */
    725 	 0xffffffff,		/* dst_mask */
    726 	 FALSE),		/* pcrel_offset */
    727 
    728   EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
    729 
    730   /* TLS thread pointer offset.  */
    731   HOWTO (R_MIPS_TLS_TPREL_HI16,	/* type */
    732 	 0,			/* rightshift */
    733 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    734 	 16,			/* bitsize */
    735 	 FALSE,			/* pc_relative */
    736 	 0,			/* bitpos */
    737 	 complain_overflow_signed, /* complain_on_overflow */
    738 	 _bfd_mips_elf_generic_reloc, /* special_function */
    739 	 "R_MIPS_TLS_TPREL_HI16", /* name */
    740 	 TRUE,			/* partial_inplace */
    741 	 0x0000ffff,		/* src_mask */
    742 	 0x0000ffff,		/* dst_mask */
    743 	 FALSE),		/* pcrel_offset */
    744 
    745   /* TLS thread pointer offset.  */
    746   HOWTO (R_MIPS_TLS_TPREL_LO16,	/* type */
    747 	 0,			/* rightshift */
    748 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    749 	 16,			/* bitsize */
    750 	 FALSE,			/* pc_relative */
    751 	 0,			/* bitpos */
    752 	 complain_overflow_signed, /* complain_on_overflow */
    753 	 _bfd_mips_elf_generic_reloc, /* special_function */
    754 	 "R_MIPS_TLS_TPREL_LO16", /* name */
    755 	 TRUE,			/* partial_inplace */
    756 	 0x0000ffff,		/* src_mask */
    757 	 0x0000ffff,		/* dst_mask */
    758 	 FALSE),		/* pcrel_offset */
    759 
    760   /* 32 bit relocation with no addend.  */
    761   HOWTO (R_MIPS_GLOB_DAT,	/* type */
    762 	 0,			/* rightshift */
    763 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    764 	 32,			/* bitsize */
    765 	 FALSE,			/* pc_relative */
    766 	 0,			/* bitpos */
    767 	 complain_overflow_dont, /* complain_on_overflow */
    768 	 _bfd_mips_elf_generic_reloc, /* special_function */
    769 	 "R_MIPS_GLOB_DAT",	/* name */
    770 	 FALSE,			/* partial_inplace */
    771 	 0x0,			/* src_mask */
    772 	 0xffffffff,		/* dst_mask */
    773 	 FALSE),		/* pcrel_offset */
    774 };
    775 
    776 /* The relocation table used for SHT_RELA sections.  */
    777 
    778 static reloc_howto_type elf_mips_howto_table_rela[] =
    779 {
    780   /* No relocation.  */
    781   HOWTO (R_MIPS_NONE,		/* type */
    782 	 0,			/* rightshift */
    783 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    784 	 0,			/* bitsize */
    785 	 FALSE,			/* pc_relative */
    786 	 0,			/* bitpos */
    787 	 complain_overflow_dont, /* complain_on_overflow */
    788 	 _bfd_mips_elf_generic_reloc, /* special_function */
    789 	 "R_MIPS_NONE",		/* name */
    790 	 FALSE,			/* partial_inplace */
    791 	 0,			/* src_mask */
    792 	 0,			/* dst_mask */
    793 	 FALSE),		/* pcrel_offset */
    794 
    795   /* 16 bit relocation.  */
    796   HOWTO (R_MIPS_16,		/* type */
    797 	 0,			/* rightshift */
    798 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    799 	 16,			/* bitsize */
    800 	 FALSE,			/* pc_relative */
    801 	 0,			/* bitpos */
    802 	 complain_overflow_signed, /* complain_on_overflow */
    803 	 _bfd_mips_elf_generic_reloc, /* special_function */
    804 	 "R_MIPS_16",		/* name */
    805 	 FALSE,			/* partial_inplace */
    806 	 0,			/* src_mask */
    807 	 0x0000,		/* dst_mask */
    808 	 FALSE),		/* pcrel_offset */
    809 
    810   /* 32 bit relocation.  */
    811   HOWTO (R_MIPS_32,		/* type */
    812 	 0,			/* rightshift */
    813 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    814 	 32,			/* bitsize */
    815 	 FALSE,			/* pc_relative */
    816 	 0,			/* bitpos */
    817 	 complain_overflow_dont, /* complain_on_overflow */
    818 	 _bfd_mips_elf_generic_reloc, /* special_function */
    819 	 "R_MIPS_32",		/* name */
    820 	 FALSE,			/* partial_inplace */
    821 	 0,			/* src_mask */
    822 	 0xffffffff,		/* dst_mask */
    823 	 FALSE),		/* pcrel_offset */
    824 
    825   /* 32 bit symbol relative relocation.  */
    826   HOWTO (R_MIPS_REL32,		/* type */
    827 	 0,			/* rightshift */
    828 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    829 	 32,			/* bitsize */
    830 	 FALSE,			/* pc_relative */
    831 	 0,			/* bitpos */
    832 	 complain_overflow_dont, /* complain_on_overflow */
    833 	 _bfd_mips_elf_generic_reloc, /* special_function */
    834 	 "R_MIPS_REL32",	/* name */
    835 	 FALSE,			/* partial_inplace */
    836 	 0,			/* src_mask */
    837 	 0xffffffff,		/* dst_mask */
    838 	 FALSE),		/* pcrel_offset */
    839 
    840   /* 26 bit jump address.  */
    841   HOWTO (R_MIPS_26,		/* type */
    842 	 2,			/* rightshift */
    843 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    844 	 26,			/* bitsize */
    845 	 FALSE,			/* pc_relative */
    846 	 0,			/* bitpos */
    847 	 complain_overflow_dont, /* complain_on_overflow */
    848 				/* This needs complex overflow
    849 				   detection, because the upper 36
    850 				   bits must match the PC + 4.  */
    851 	 _bfd_mips_elf_generic_reloc, /* special_function */
    852 	 "R_MIPS_26",		/* name */
    853 	 FALSE,			/* partial_inplace */
    854 	 0,			/* src_mask */
    855 	 0x03ffffff,		/* dst_mask */
    856 	 FALSE),		/* pcrel_offset */
    857 
    858   /* High 16 bits of symbol value.  */
    859   HOWTO (R_MIPS_HI16,		/* type */
    860 	 0,			/* rightshift */
    861 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    862 	 16,			/* bitsize */
    863 	 FALSE,			/* pc_relative */
    864 	 0,			/* bitpos */
    865 	 complain_overflow_dont, /* complain_on_overflow */
    866 	 _bfd_mips_elf_generic_reloc, /* special_function */
    867 	 "R_MIPS_HI16",		/* name */
    868 	 FALSE,			/* partial_inplace */
    869 	 0,			/* src_mask */
    870 	 0x0000ffff,		/* dst_mask */
    871 	 FALSE),		/* pcrel_offset */
    872 
    873   /* Low 16 bits of symbol value.  */
    874   HOWTO (R_MIPS_LO16,		/* type */
    875 	 0,			/* rightshift */
    876 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    877 	 16,			/* bitsize */
    878 	 FALSE,			/* pc_relative */
    879 	 0,			/* bitpos */
    880 	 complain_overflow_dont, /* complain_on_overflow */
    881 	 _bfd_mips_elf_generic_reloc, /* special_function */
    882 	 "R_MIPS_LO16",		/* name */
    883 	 FALSE,			/* partial_inplace */
    884 	 0,			/* src_mask */
    885 	 0x0000ffff,		/* dst_mask */
    886 	 FALSE),		/* pcrel_offset */
    887 
    888   /* GP relative reference.  */
    889   HOWTO (R_MIPS_GPREL16,	/* type */
    890 	 0,			/* rightshift */
    891 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    892 	 16,			/* bitsize */
    893 	 FALSE,			/* pc_relative */
    894 	 0,			/* bitpos */
    895 	 complain_overflow_signed, /* complain_on_overflow */
    896 	 mips_elf_gprel16_reloc, /* special_function */
    897 	 "R_MIPS_GPREL16",	/* name */
    898 	 FALSE,			/* partial_inplace */
    899 	 0,			/* src_mask */
    900 	 0x0000ffff,		/* dst_mask */
    901 	 FALSE),		/* pcrel_offset */
    902 
    903   /* Reference to literal section.  */
    904   HOWTO (R_MIPS_LITERAL,	/* type */
    905 	 0,			/* rightshift */
    906 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    907 	 16,			/* bitsize */
    908 	 FALSE,			/* pc_relative */
    909 	 0,			/* bitpos */
    910 	 complain_overflow_signed, /* complain_on_overflow */
    911 	 mips_elf_literal_reloc, /* special_function */
    912 	 "R_MIPS_LITERAL",	/* name */
    913 	 FALSE,			/* partial_inplace */
    914 	 0,			/* src_mask */
    915 	 0x0000ffff,		/* dst_mask */
    916 	 FALSE),		/* pcrel_offset */
    917 
    918   /* Reference to global offset table.  */
    919   HOWTO (R_MIPS_GOT16,		/* type */
    920 	 0,			/* rightshift */
    921 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    922 	 16,			/* bitsize */
    923 	 FALSE,			/* pc_relative */
    924 	 0,			/* bitpos */
    925 	 complain_overflow_signed, /* complain_on_overflow */
    926 	 _bfd_mips_elf_generic_reloc, /* special_function */
    927 	 "R_MIPS_GOT16",	/* name */
    928 	 FALSE,			/* partial_inplace */
    929 	 0,			/* src_mask */
    930 	 0x0000ffff,		/* dst_mask */
    931 	 FALSE),		/* pcrel_offset */
    932 
    933   /* 16 bit PC relative reference.  Note that the ABI document has a typo
    934      and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
    935      We do the right thing here.  */
    936   HOWTO (R_MIPS_PC16,		/* type */
    937 	 2,			/* rightshift */
    938 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    939 	 16,			/* bitsize */
    940 	 TRUE,			/* pc_relative */
    941 	 0,			/* bitpos */
    942 	 complain_overflow_signed, /* complain_on_overflow */
    943 	 _bfd_mips_elf_generic_reloc, /* special_function */
    944 	 "R_MIPS_PC16",		/* name */
    945 	 FALSE,			/* partial_inplace */
    946 	 0,			/* src_mask */
    947 	 0x0000ffff,		/* dst_mask */
    948 	 TRUE),			/* pcrel_offset */
    949 
    950   /* 16 bit call through global offset table.  */
    951   HOWTO (R_MIPS_CALL16,		/* type */
    952 	 0,			/* rightshift */
    953 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    954 	 16,			/* bitsize */
    955 	 FALSE,			/* pc_relative */
    956 	 0,			/* bitpos */
    957 	 complain_overflow_signed, /* complain_on_overflow */
    958 	 _bfd_mips_elf_generic_reloc, /* special_function */
    959 	 "R_MIPS_CALL16",	/* name */
    960 	 FALSE,			/* partial_inplace */
    961 	 0,			/* src_mask */
    962 	 0x0000ffff,		/* dst_mask */
    963 	 FALSE),		/* pcrel_offset */
    964 
    965   /* 32 bit GP relative reference.  */
    966   HOWTO (R_MIPS_GPREL32,	/* type */
    967 	 0,			/* rightshift */
    968 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    969 	 32,			/* bitsize */
    970 	 FALSE,			/* pc_relative */
    971 	 0,			/* bitpos */
    972 	 complain_overflow_dont, /* complain_on_overflow */
    973 	 mips_elf_gprel32_reloc, /* special_function */
    974 	 "R_MIPS_GPREL32",	/* name */
    975 	 FALSE,			/* partial_inplace */
    976 	 0,			/* src_mask */
    977 	 0xffffffff,		/* dst_mask */
    978 	 FALSE),		/* pcrel_offset */
    979 
    980   EMPTY_HOWTO (13),
    981   EMPTY_HOWTO (14),
    982   EMPTY_HOWTO (15),
    983 
    984   /* A 5 bit shift field.  */
    985   HOWTO (R_MIPS_SHIFT5,		/* type */
    986 	 0,			/* rightshift */
    987 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    988 	 5,			/* bitsize */
    989 	 FALSE,			/* pc_relative */
    990 	 6,			/* bitpos */
    991 	 complain_overflow_bitfield, /* complain_on_overflow */
    992 	 _bfd_mips_elf_generic_reloc, /* special_function */
    993 	 "R_MIPS_SHIFT5",	/* name */
    994 	 FALSE,			/* partial_inplace */
    995 	 0,			/* src_mask */
    996 	 0x000007c0,		/* dst_mask */
    997 	 FALSE),		/* pcrel_offset */
    998 
    999   /* A 6 bit shift field.  */
   1000   HOWTO (R_MIPS_SHIFT6,		/* type */
   1001 	 0,			/* rightshift */
   1002 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1003 	 6,			/* bitsize */
   1004 	 FALSE,			/* pc_relative */
   1005 	 6,			/* bitpos */
   1006 	 complain_overflow_bitfield, /* complain_on_overflow */
   1007 	 mips_elf_shift6_reloc,	/* special_function */
   1008 	 "R_MIPS_SHIFT6",	/* name */
   1009 	 FALSE,			/* partial_inplace */
   1010 	 0,			/* src_mask */
   1011 	 0x000007c4,		/* dst_mask */
   1012 	 FALSE),		/* pcrel_offset */
   1013 
   1014   /* 64 bit relocation.  */
   1015   HOWTO (R_MIPS_64,		/* type */
   1016 	 0,			/* rightshift */
   1017 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   1018 	 64,			/* bitsize */
   1019 	 FALSE,			/* pc_relative */
   1020 	 0,			/* bitpos */
   1021 	 complain_overflow_dont, /* complain_on_overflow */
   1022 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1023 	 "R_MIPS_64",		/* name */
   1024 	 FALSE,			/* partial_inplace */
   1025 	 0,			/* src_mask */
   1026 	 MINUS_ONE,		/* dst_mask */
   1027 	 FALSE),		/* pcrel_offset */
   1028 
   1029   /* Displacement in the global offset table.  */
   1030   HOWTO (R_MIPS_GOT_DISP,	/* type */
   1031 	 0,			/* rightshift */
   1032 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1033 	 16,			/* bitsize */
   1034 	 FALSE,			/* pc_relative */
   1035 	 0,			/* bitpos */
   1036 	 complain_overflow_signed, /* complain_on_overflow */
   1037 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1038 	 "R_MIPS_GOT_DISP",	/* name */
   1039 	 FALSE,			/* partial_inplace */
   1040 	 0,			/* src_mask */
   1041 	 0x0000ffff,		/* dst_mask */
   1042 	 FALSE),		/* pcrel_offset */
   1043 
   1044   /* Displacement to page pointer in the global offset table.  */
   1045   HOWTO (R_MIPS_GOT_PAGE,	/* type */
   1046 	 0,			/* rightshift */
   1047 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1048 	 16,			/* bitsize */
   1049 	 FALSE,			/* pc_relative */
   1050 	 0,			/* bitpos */
   1051 	 complain_overflow_signed, /* complain_on_overflow */
   1052 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1053 	 "R_MIPS_GOT_PAGE",	/* name */
   1054 	 FALSE,			/* partial_inplace */
   1055 	 0,			/* src_mask */
   1056 	 0x0000ffff,		/* dst_mask */
   1057 	 FALSE),		/* pcrel_offset */
   1058 
   1059   /* Offset from page pointer in the global offset table.  */
   1060   HOWTO (R_MIPS_GOT_OFST,	/* type */
   1061 	 0,			/* rightshift */
   1062 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1063 	 16,			/* bitsize */
   1064 	 FALSE,			/* pc_relative */
   1065 	 0,			/* bitpos */
   1066 	 complain_overflow_signed, /* complain_on_overflow */
   1067 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1068 	 "R_MIPS_GOT_OFST",	/* name */
   1069 	 FALSE,			/* partial_inplace */
   1070 	 0,			/* src_mask */
   1071 	 0x0000ffff,		/* dst_mask */
   1072 	 FALSE),		/* pcrel_offset */
   1073 
   1074   /* High 16 bits of displacement in global offset table.  */
   1075   HOWTO (R_MIPS_GOT_HI16,	/* type */
   1076 	 0,			/* rightshift */
   1077 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1078 	 16,			/* bitsize */
   1079 	 FALSE,			/* pc_relative */
   1080 	 0,			/* bitpos */
   1081 	 complain_overflow_dont, /* complain_on_overflow */
   1082 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1083 	 "R_MIPS_GOT_HI16",	/* name */
   1084 	 FALSE,			/* partial_inplace */
   1085 	 0,			/* src_mask */
   1086 	 0x0000ffff,		/* dst_mask */
   1087 	 FALSE),		/* pcrel_offset */
   1088 
   1089   /* Low 16 bits of displacement in global offset table.  */
   1090   HOWTO (R_MIPS_GOT_LO16,	/* type */
   1091 	 0,			/* rightshift */
   1092 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1093 	 16,			/* bitsize */
   1094 	 FALSE,			/* pc_relative */
   1095 	 0,			/* bitpos */
   1096 	 complain_overflow_dont, /* complain_on_overflow */
   1097 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1098 	 "R_MIPS_GOT_LO16",	/* name */
   1099 	 FALSE,			/* partial_inplace */
   1100 	 0,			/* src_mask */
   1101 	 0x0000ffff,		/* dst_mask */
   1102 	 FALSE),		/* pcrel_offset */
   1103 
   1104   /* 64 bit subtraction.  */
   1105   HOWTO (R_MIPS_SUB,		/* type */
   1106 	 0,			/* rightshift */
   1107 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   1108 	 64,			/* bitsize */
   1109 	 FALSE,			/* pc_relative */
   1110 	 0,			/* bitpos */
   1111 	 complain_overflow_dont, /* complain_on_overflow */
   1112 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1113 	 "R_MIPS_SUB",		/* name */
   1114 	 FALSE,			/* partial_inplace */
   1115 	 0,			/* src_mask */
   1116 	 MINUS_ONE,		/* dst_mask */
   1117 	 FALSE),		/* pcrel_offset */
   1118 
   1119   /* Insert the addend as an instruction.  */
   1120   /* FIXME: Not handled correctly.  */
   1121   HOWTO (R_MIPS_INSERT_A,	/* type */
   1122 	 0,			/* rightshift */
   1123 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1124 	 32,			/* bitsize */
   1125 	 FALSE,			/* pc_relative */
   1126 	 0,			/* bitpos */
   1127 	 complain_overflow_dont, /* complain_on_overflow */
   1128 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1129 	 "R_MIPS_INSERT_A",	/* name */
   1130 	 FALSE,			/* partial_inplace */
   1131 	 0,			/* src_mask */
   1132 	 0xffffffff,		/* dst_mask */
   1133 	 FALSE),		/* pcrel_offset */
   1134 
   1135   /* Insert the addend as an instruction, and change all relocations
   1136      to refer to the old instruction at the address.  */
   1137   /* FIXME: Not handled correctly.  */
   1138   HOWTO (R_MIPS_INSERT_B,	/* type */
   1139 	 0,			/* rightshift */
   1140 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1141 	 32,			/* bitsize */
   1142 	 FALSE,			/* pc_relative */
   1143 	 0,			/* bitpos */
   1144 	 complain_overflow_dont, /* complain_on_overflow */
   1145 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1146 	 "R_MIPS_INSERT_B",	/* name */
   1147 	 FALSE,			/* partial_inplace */
   1148 	 0,			/* src_mask */
   1149 	 0xffffffff,		/* dst_mask */
   1150 	 FALSE),		/* pcrel_offset */
   1151 
   1152   /* Delete a 32 bit instruction.  */
   1153   /* FIXME: Not handled correctly.  */
   1154   HOWTO (R_MIPS_DELETE,		/* type */
   1155 	 0,			/* rightshift */
   1156 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1157 	 32,			/* bitsize */
   1158 	 FALSE,			/* pc_relative */
   1159 	 0,			/* bitpos */
   1160 	 complain_overflow_dont, /* complain_on_overflow */
   1161 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1162 	 "R_MIPS_DELETE",	/* name */
   1163 	 FALSE,			/* partial_inplace */
   1164 	 0,			/* src_mask */
   1165 	 0xffffffff,		/* dst_mask */
   1166 	 FALSE),		/* pcrel_offset */
   1167 
   1168   /* Get the higher value of a 64 bit addend.  */
   1169   HOWTO (R_MIPS_HIGHER,		/* type */
   1170 	 0,			/* rightshift */
   1171 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1172 	 16,			/* bitsize */
   1173 	 FALSE,			/* pc_relative */
   1174 	 0,			/* bitpos */
   1175 	 complain_overflow_dont, /* complain_on_overflow */
   1176 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1177 	 "R_MIPS_HIGHER",	/* name */
   1178 	 FALSE,			/* partial_inplace */
   1179 	 0,			/* src_mask */
   1180 	 0x0000ffff,		/* dst_mask */
   1181 	 FALSE),		/* pcrel_offset */
   1182 
   1183   /* Get the highest value of a 64 bit addend.  */
   1184   HOWTO (R_MIPS_HIGHEST,	/* type */
   1185 	 0,			/* rightshift */
   1186 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1187 	 16,			/* bitsize */
   1188 	 FALSE,			/* pc_relative */
   1189 	 0,			/* bitpos */
   1190 	 complain_overflow_dont, /* complain_on_overflow */
   1191 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1192 	 "R_MIPS_HIGHEST",	/* name */
   1193 	 FALSE,			/* partial_inplace */
   1194 	 0,			/* src_mask */
   1195 	 0x0000ffff,		/* dst_mask */
   1196 	 FALSE),		/* pcrel_offset */
   1197 
   1198   /* High 16 bits of displacement in global offset table.  */
   1199   HOWTO (R_MIPS_CALL_HI16,	/* type */
   1200 	 0,			/* rightshift */
   1201 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1202 	 16,			/* bitsize */
   1203 	 FALSE,			/* pc_relative */
   1204 	 0,			/* bitpos */
   1205 	 complain_overflow_dont, /* complain_on_overflow */
   1206 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1207 	 "R_MIPS_CALL_HI16",	/* name */
   1208 	 FALSE,			/* partial_inplace */
   1209 	 0,			/* src_mask */
   1210 	 0x0000ffff,		/* dst_mask */
   1211 	 FALSE),		/* pcrel_offset */
   1212 
   1213   /* Low 16 bits of displacement in global offset table.  */
   1214   HOWTO (R_MIPS_CALL_LO16,	/* type */
   1215 	 0,			/* rightshift */
   1216 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1217 	 16,			/* bitsize */
   1218 	 FALSE,			/* pc_relative */
   1219 	 0,			/* bitpos */
   1220 	 complain_overflow_dont, /* complain_on_overflow */
   1221 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1222 	 "R_MIPS_CALL_LO16",	/* name */
   1223 	 FALSE,			/* partial_inplace */
   1224 	 0,			/* src_mask */
   1225 	 0x0000ffff,		/* dst_mask */
   1226 	 FALSE),		/* pcrel_offset */
   1227 
   1228   /* Section displacement, used by an associated event location section.  */
   1229   HOWTO (R_MIPS_SCN_DISP,	/* type */
   1230 	 0,			/* rightshift */
   1231 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1232 	 32,			/* bitsize */
   1233 	 FALSE,			/* pc_relative */
   1234 	 0,			/* bitpos */
   1235 	 complain_overflow_dont, /* complain_on_overflow */
   1236 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1237 	 "R_MIPS_SCN_DISP",	/* name */
   1238 	 FALSE,			/* partial_inplace */
   1239 	 0,			/* src_mask */
   1240 	 0xffffffff,		/* dst_mask */
   1241 	 FALSE),		/* pcrel_offset */
   1242 
   1243   /* 16 bit relocation.  */
   1244   HOWTO (R_MIPS_REL16,		/* type */
   1245 	 0,			/* rightshift */
   1246 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1247 	 16,			/* bitsize */
   1248 	 FALSE,			/* pc_relative */
   1249 	 0,			/* bitpos */
   1250 	 complain_overflow_signed, /* complain_on_overflow */
   1251 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1252 	 "R_MIPS_REL16",	/* name */
   1253 	 FALSE,			/* partial_inplace */
   1254 	 0,			/* src_mask */
   1255 	 0xffff,		/* dst_mask */
   1256 	 FALSE),		/* pcrel_offset */
   1257 
   1258   /* These two are obsolete.  */
   1259   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
   1260   EMPTY_HOWTO (R_MIPS_PJUMP),
   1261 
   1262   /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
   1263      It must be used for multigot GOT's (and only there).  */
   1264   HOWTO (R_MIPS_RELGOT,		/* type */
   1265 	 0,			/* rightshift */
   1266 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1267 	 32,			/* bitsize */
   1268 	 FALSE,			/* pc_relative */
   1269 	 0,			/* bitpos */
   1270 	 complain_overflow_dont, /* complain_on_overflow */
   1271 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1272 	 "R_MIPS_RELGOT",	/* name */
   1273 	 FALSE,			/* partial_inplace */
   1274 	 0,			/* src_mask */
   1275 	 0xffffffff,		/* dst_mask */
   1276 	 FALSE),		/* pcrel_offset */
   1277 
   1278   /* Protected jump conversion.  This is an optimization hint.  No
   1279      relocation is required for correctness.  */
   1280   HOWTO (R_MIPS_JALR,	        /* type */
   1281 	 0,			/* rightshift */
   1282 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1283 	 32,			/* bitsize */
   1284 	 FALSE,			/* pc_relative */
   1285 	 0,			/* bitpos */
   1286 	 complain_overflow_dont, /* complain_on_overflow */
   1287 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1288 	 "R_MIPS_JALR",	        /* name */
   1289 	 FALSE,			/* partial_inplace */
   1290 	 0,			/* src_mask */
   1291 	 0,			/* dst_mask */
   1292 	 FALSE),		/* pcrel_offset */
   1293 
   1294   /* TLS GD/LD dynamic relocations.  */
   1295   HOWTO (R_MIPS_TLS_DTPMOD32,	/* type */
   1296 	 0,			/* rightshift */
   1297 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1298 	 32,			/* bitsize */
   1299 	 FALSE,			/* pc_relative */
   1300 	 0,			/* bitpos */
   1301 	 complain_overflow_dont, /* complain_on_overflow */
   1302 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1303 	 "R_MIPS_TLS_DTPMOD32",	/* name */
   1304 	 FALSE,			/* partial_inplace */
   1305 	 0,			/* src_mask */
   1306 	 0xffffffff,		/* dst_mask */
   1307 	 FALSE),		/* pcrel_offset */
   1308 
   1309   HOWTO (R_MIPS_TLS_DTPREL32,	/* type */
   1310 	 0,			/* rightshift */
   1311 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1312 	 32,			/* bitsize */
   1313 	 FALSE,			/* pc_relative */
   1314 	 0,			/* bitpos */
   1315 	 complain_overflow_dont, /* complain_on_overflow */
   1316 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1317 	 "R_MIPS_TLS_DTPREL32",	/* name */
   1318 	 FALSE,			/* partial_inplace */
   1319 	 0,			/* src_mask */
   1320 	 0xffffffff,		/* dst_mask */
   1321 	 FALSE),		/* pcrel_offset */
   1322 
   1323   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
   1324   EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
   1325 
   1326   /* TLS general dynamic variable reference.  */
   1327   HOWTO (R_MIPS_TLS_GD,		/* type */
   1328 	 0,			/* rightshift */
   1329 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1330 	 16,			/* bitsize */
   1331 	 FALSE,			/* pc_relative */
   1332 	 0,			/* bitpos */
   1333 	 complain_overflow_signed, /* complain_on_overflow */
   1334 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1335 	 "R_MIPS_TLS_GD",	/* name */
   1336 	 FALSE,			/* partial_inplace */
   1337 	 0,			/* src_mask */
   1338 	 0x0000ffff,		/* dst_mask */
   1339 	 FALSE),		/* pcrel_offset */
   1340 
   1341   /* TLS local dynamic variable reference.  */
   1342   HOWTO (R_MIPS_TLS_LDM,	/* type */
   1343 	 0,			/* rightshift */
   1344 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1345 	 16,			/* bitsize */
   1346 	 FALSE,			/* pc_relative */
   1347 	 0,			/* bitpos */
   1348 	 complain_overflow_signed, /* complain_on_overflow */
   1349 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1350 	 "R_MIPS_TLS_LDM",	/* name */
   1351 	 FALSE,			/* partial_inplace */
   1352 	 0,			/* src_mask */
   1353 	 0x0000ffff,		/* dst_mask */
   1354 	 FALSE),		/* pcrel_offset */
   1355 
   1356   /* TLS local dynamic offset.  */
   1357   HOWTO (R_MIPS_TLS_DTPREL_HI16,	/* type */
   1358 	 0,			/* rightshift */
   1359 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1360 	 16,			/* bitsize */
   1361 	 FALSE,			/* pc_relative */
   1362 	 0,			/* bitpos */
   1363 	 complain_overflow_signed, /* complain_on_overflow */
   1364 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1365 	 "R_MIPS_TLS_DTPREL_HI16",	/* name */
   1366 	 FALSE,			/* partial_inplace */
   1367 	 0,			/* src_mask */
   1368 	 0x0000ffff,		/* dst_mask */
   1369 	 FALSE),		/* pcrel_offset */
   1370 
   1371   /* TLS local dynamic offset.  */
   1372   HOWTO (R_MIPS_TLS_DTPREL_LO16,	/* type */
   1373 	 0,			/* rightshift */
   1374 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1375 	 16,			/* bitsize */
   1376 	 FALSE,			/* pc_relative */
   1377 	 0,			/* bitpos */
   1378 	 complain_overflow_signed, /* complain_on_overflow */
   1379 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1380 	 "R_MIPS_TLS_DTPREL_LO16",	/* name */
   1381 	 FALSE,			/* partial_inplace */
   1382 	 0,			/* src_mask */
   1383 	 0x0000ffff,		/* dst_mask */
   1384 	 FALSE),		/* pcrel_offset */
   1385 
   1386   /* TLS thread pointer offset.  */
   1387   HOWTO (R_MIPS_TLS_GOTTPREL,	/* type */
   1388 	 0,			/* rightshift */
   1389 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1390 	 16,			/* bitsize */
   1391 	 FALSE,			/* pc_relative */
   1392 	 0,			/* bitpos */
   1393 	 complain_overflow_signed, /* complain_on_overflow */
   1394 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1395 	 "R_MIPS_TLS_GOTTPREL",	/* name */
   1396 	 FALSE,			/* partial_inplace */
   1397 	 0,			/* src_mask */
   1398 	 0x0000ffff,		/* dst_mask */
   1399 	 FALSE),		/* pcrel_offset */
   1400 
   1401   /* TLS IE dynamic relocations.  */
   1402   HOWTO (R_MIPS_TLS_TPREL32,	/* type */
   1403 	 0,			/* rightshift */
   1404 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1405 	 32,			/* bitsize */
   1406 	 FALSE,			/* pc_relative */
   1407 	 0,			/* bitpos */
   1408 	 complain_overflow_dont, /* complain_on_overflow */
   1409 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1410 	 "R_MIPS_TLS_TPREL32",	/* name */
   1411 	 FALSE,			/* partial_inplace */
   1412 	 0,			/* src_mask */
   1413 	 0xffffffff,		/* dst_mask */
   1414 	 FALSE),		/* pcrel_offset */
   1415 
   1416   EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
   1417 
   1418   /* TLS thread pointer offset.  */
   1419   HOWTO (R_MIPS_TLS_TPREL_HI16,	/* type */
   1420 	 0,			/* rightshift */
   1421 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1422 	 16,			/* bitsize */
   1423 	 FALSE,			/* pc_relative */
   1424 	 0,			/* bitpos */
   1425 	 complain_overflow_signed, /* complain_on_overflow */
   1426 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1427 	 "R_MIPS_TLS_TPREL_HI16", /* name */
   1428 	 FALSE,			/* partial_inplace */
   1429 	 0,			/* src_mask */
   1430 	 0x0000ffff,		/* dst_mask */
   1431 	 FALSE),		/* pcrel_offset */
   1432 
   1433   /* TLS thread pointer offset.  */
   1434   HOWTO (R_MIPS_TLS_TPREL_LO16,	/* type */
   1435 	 0,			/* rightshift */
   1436 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1437 	 16,			/* bitsize */
   1438 	 FALSE,			/* pc_relative */
   1439 	 0,			/* bitpos */
   1440 	 complain_overflow_signed, /* complain_on_overflow */
   1441 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1442 	 "R_MIPS_TLS_TPREL_LO16", /* name */
   1443 	 FALSE,			/* partial_inplace */
   1444 	 0,			/* src_mask */
   1445 	 0x0000ffff,		/* dst_mask */
   1446 	 FALSE),		/* pcrel_offset */
   1447 
   1448   /* 32 bit relocation with no addend.  */
   1449   HOWTO (R_MIPS_GLOB_DAT,	/* type */
   1450 	 0,			/* rightshift */
   1451 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1452 	 32,			/* bitsize */
   1453 	 FALSE,			/* pc_relative */
   1454 	 0,			/* bitpos */
   1455 	 complain_overflow_dont, /* complain_on_overflow */
   1456 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1457 	 "R_MIPS_GLOB_DAT",	/* name */
   1458 	 FALSE,			/* partial_inplace */
   1459 	 0x0,			/* src_mask */
   1460 	 0xffffffff,		/* dst_mask */
   1461 	 FALSE),		/* pcrel_offset */
   1462 };
   1463 
   1464 static reloc_howto_type elf_mips16_howto_table_rel[] =
   1465 {
   1466   /* The reloc used for the mips16 jump instruction.  */
   1467   HOWTO (R_MIPS16_26,		/* type */
   1468 	 2,			/* rightshift */
   1469 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1470 	 26,			/* bitsize */
   1471 	 FALSE,			/* pc_relative */
   1472 	 0,			/* bitpos */
   1473 	 complain_overflow_dont, /* complain_on_overflow */
   1474 	 			/* This needs complex overflow
   1475 				   detection, because the upper four
   1476 				   bits must match the PC.  */
   1477 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1478 	 "R_MIPS16_26",		/* name */
   1479 	 TRUE,			/* partial_inplace */
   1480 	 0x3ffffff,		/* src_mask */
   1481 	 0x3ffffff,		/* dst_mask */
   1482 	 FALSE),		/* pcrel_offset */
   1483 
   1484   /* The reloc used for the mips16 gprel instruction.  */
   1485   HOWTO (R_MIPS16_GPREL,	/* type */
   1486 	 0,			/* rightshift */
   1487 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1488 	 16,			/* bitsize */
   1489 	 FALSE,			/* pc_relative */
   1490 	 0,			/* bitpos */
   1491 	 complain_overflow_signed, /* complain_on_overflow */
   1492 	 mips16_gprel_reloc,	/* special_function */
   1493 	 "R_MIPS16_GPREL",	/* name */
   1494 	 TRUE,			/* partial_inplace */
   1495 	 0x0000ffff,		/* src_mask */
   1496 	 0x0000ffff,	        /* dst_mask */
   1497 	 FALSE),		/* pcrel_offset */
   1498 
   1499   /* A MIPS16 reference to the global offset table.  */
   1500   HOWTO (R_MIPS16_GOT16,	/* type */
   1501 	 0,			/* rightshift */
   1502 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1503 	 16,			/* bitsize */
   1504 	 FALSE,			/* pc_relative */
   1505 	 0,			/* bitpos */
   1506 	 complain_overflow_dont, /* complain_on_overflow */
   1507 	 _bfd_mips_elf_got16_reloc, /* special_function */
   1508 	 "R_MIPS16_GOT16",	/* name */
   1509 	 TRUE,			/* partial_inplace */
   1510 	 0x0000ffff,		/* src_mask */
   1511 	 0x0000ffff,	        /* dst_mask */
   1512 	 FALSE),		/* pcrel_offset */
   1513 
   1514   /* A MIPS16 call through the global offset table.  */
   1515   HOWTO (R_MIPS16_CALL16,	/* type */
   1516 	 0,			/* rightshift */
   1517 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1518 	 16,			/* bitsize */
   1519 	 FALSE,			/* pc_relative */
   1520 	 0,			/* bitpos */
   1521 	 complain_overflow_dont, /* complain_on_overflow */
   1522 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1523 	 "R_MIPS16_CALL16",	/* name */
   1524 	 TRUE,			/* partial_inplace */
   1525 	 0x0000ffff,		/* src_mask */
   1526 	 0x0000ffff,	        /* dst_mask */
   1527 	 FALSE),		/* pcrel_offset */
   1528 
   1529   /* MIPS16 high 16 bits of symbol value.  */
   1530   HOWTO (R_MIPS16_HI16,		/* type */
   1531 	 16,			/* rightshift */
   1532 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1533 	 16,			/* bitsize */
   1534 	 FALSE,			/* pc_relative */
   1535 	 0,			/* bitpos */
   1536 	 complain_overflow_dont, /* complain_on_overflow */
   1537 	 _bfd_mips_elf_hi16_reloc, /* special_function */
   1538 	 "R_MIPS16_HI16",	/* name */
   1539 	 TRUE,			/* partial_inplace */
   1540 	 0x0000ffff,		/* src_mask */
   1541 	 0x0000ffff,		/* dst_mask */
   1542 	 FALSE),		/* pcrel_offset */
   1543 
   1544   /* MIPS16 low 16 bits of symbol value.  */
   1545   HOWTO (R_MIPS16_LO16,		/* type */
   1546 	 0,			/* rightshift */
   1547 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1548 	 16,			/* bitsize */
   1549 	 FALSE,			/* pc_relative */
   1550 	 0,			/* bitpos */
   1551 	 complain_overflow_dont, /* complain_on_overflow */
   1552 	 _bfd_mips_elf_lo16_reloc, /* special_function */
   1553 	 "R_MIPS16_LO16",	/* name */
   1554 	 TRUE,			/* partial_inplace */
   1555 	 0x0000ffff,		/* src_mask */
   1556 	 0x0000ffff,		/* dst_mask */
   1557 	 FALSE),		/* pcrel_offset */
   1558 
   1559   /* MIPS16 TLS general dynamic variable reference.  */
   1560   HOWTO (R_MIPS16_TLS_GD,	/* type */
   1561 	 0,			/* rightshift */
   1562 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1563 	 16,			/* bitsize */
   1564 	 FALSE,			/* pc_relative */
   1565 	 0,			/* bitpos */
   1566 	 complain_overflow_signed, /* complain_on_overflow */
   1567 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1568 	 "R_MIPS16_TLS_GD",	/* name */
   1569 	 TRUE,			/* partial_inplace */
   1570 	 0x0000ffff,		/* src_mask */
   1571 	 0x0000ffff,		/* dst_mask */
   1572 	 FALSE),		/* pcrel_offset */
   1573 
   1574   /* MIPS16 TLS local dynamic variable reference.  */
   1575   HOWTO (R_MIPS16_TLS_LDM,	/* type */
   1576 	 0,			/* rightshift */
   1577 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1578 	 16,			/* bitsize */
   1579 	 FALSE,			/* pc_relative */
   1580 	 0,			/* bitpos */
   1581 	 complain_overflow_signed, /* complain_on_overflow */
   1582 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1583 	 "R_MIPS16_TLS_LDM",	/* name */
   1584 	 TRUE,			/* partial_inplace */
   1585 	 0x0000ffff,		/* src_mask */
   1586 	 0x0000ffff,		/* dst_mask */
   1587 	 FALSE),		/* pcrel_offset */
   1588 
   1589   /* MIPS16 TLS local dynamic offset.  */
   1590   HOWTO (R_MIPS16_TLS_DTPREL_HI16,	/* type */
   1591 	 0,			/* rightshift */
   1592 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1593 	 16,			/* bitsize */
   1594 	 FALSE,			/* pc_relative */
   1595 	 0,			/* bitpos */
   1596 	 complain_overflow_signed, /* complain_on_overflow */
   1597 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1598 	 "R_MIPS16_TLS_DTPREL_HI16",	/* name */
   1599 	 TRUE,			/* partial_inplace */
   1600 	 0x0000ffff,		/* src_mask */
   1601 	 0x0000ffff,		/* dst_mask */
   1602 	 FALSE),		/* pcrel_offset */
   1603 
   1604   /* MIPS16 TLS local dynamic offset.  */
   1605   HOWTO (R_MIPS16_TLS_DTPREL_LO16,	/* type */
   1606 	 0,			/* rightshift */
   1607 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1608 	 16,			/* bitsize */
   1609 	 FALSE,			/* pc_relative */
   1610 	 0,			/* bitpos */
   1611 	 complain_overflow_signed, /* complain_on_overflow */
   1612 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1613 	 "R_MIPS16_TLS_DTPREL_LO16",	/* name */
   1614 	 TRUE,			/* partial_inplace */
   1615 	 0x0000ffff,		/* src_mask */
   1616 	 0x0000ffff,		/* dst_mask */
   1617 	 FALSE),		/* pcrel_offset */
   1618 
   1619   /* MIPS16 TLS thread pointer offset.  */
   1620   HOWTO (R_MIPS16_TLS_GOTTPREL,	/* type */
   1621 	 0,			/* rightshift */
   1622 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1623 	 16,			/* bitsize */
   1624 	 FALSE,			/* pc_relative */
   1625 	 0,			/* bitpos */
   1626 	 complain_overflow_signed, /* complain_on_overflow */
   1627 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1628 	 "R_MIPS16_TLS_GOTTPREL",	/* name */
   1629 	 TRUE,			/* partial_inplace */
   1630 	 0x0000ffff,		/* src_mask */
   1631 	 0x0000ffff,		/* dst_mask */
   1632 	 FALSE),		/* pcrel_offset */
   1633 
   1634   /* MIPS16 TLS thread pointer offset.  */
   1635   HOWTO (R_MIPS16_TLS_TPREL_HI16,	/* type */
   1636 	 0,			/* rightshift */
   1637 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1638 	 16,			/* bitsize */
   1639 	 FALSE,			/* pc_relative */
   1640 	 0,			/* bitpos */
   1641 	 complain_overflow_signed, /* complain_on_overflow */
   1642 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1643 	 "R_MIPS16_TLS_TPREL_HI16", /* name */
   1644 	 TRUE,			/* partial_inplace */
   1645 	 0x0000ffff,		/* src_mask */
   1646 	 0x0000ffff,		/* dst_mask */
   1647 	 FALSE),		/* pcrel_offset */
   1648 
   1649   /* MIPS16 TLS thread pointer offset.  */
   1650   HOWTO (R_MIPS16_TLS_TPREL_LO16,	/* type */
   1651 	 0,			/* rightshift */
   1652 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1653 	 16,			/* bitsize */
   1654 	 FALSE,			/* pc_relative */
   1655 	 0,			/* bitpos */
   1656 	 complain_overflow_signed, /* complain_on_overflow */
   1657 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1658 	 "R_MIPS16_TLS_TPREL_LO16", /* name */
   1659 	 TRUE,			/* partial_inplace */
   1660 	 0x0000ffff,		/* src_mask */
   1661 	 0x0000ffff,		/* dst_mask */
   1662 	 FALSE),		/* pcrel_offset */
   1663 };
   1664 
   1665 static reloc_howto_type elf_mips16_howto_table_rela[] =
   1666 {
   1667   /* The reloc used for the mips16 jump instruction.  */
   1668   HOWTO (R_MIPS16_26,		/* type */
   1669 	 2,			/* rightshift */
   1670 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1671 	 26,			/* bitsize */
   1672 	 FALSE,			/* pc_relative */
   1673 	 0,			/* bitpos */
   1674 	 complain_overflow_dont, /* complain_on_overflow */
   1675 	 			/* This needs complex overflow
   1676 				   detection, because the upper four
   1677 				   bits must match the PC.  */
   1678 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1679 	 "R_MIPS16_26",		/* name */
   1680 	 FALSE,			/* partial_inplace */
   1681 	 0,			/* src_mask */
   1682 	 0x3ffffff,		/* dst_mask */
   1683 	 FALSE),		/* pcrel_offset */
   1684 
   1685   /* The reloc used for the mips16 gprel instruction.  */
   1686   HOWTO (R_MIPS16_GPREL,	/* type */
   1687 	 0,			/* rightshift */
   1688 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1689 	 16,			/* bitsize */
   1690 	 FALSE,			/* pc_relative */
   1691 	 0,			/* bitpos */
   1692 	 complain_overflow_signed, /* complain_on_overflow */
   1693 	 mips16_gprel_reloc,	/* special_function */
   1694 	 "R_MIPS16_GPREL",	/* name */
   1695 	 FALSE,			/* partial_inplace */
   1696 	 0,			/* src_mask */
   1697 	 0x0000ffff,	        /* dst_mask */
   1698 	 FALSE),		/* pcrel_offset */
   1699 
   1700   /* A MIPS16 reference to the global offset table.  */
   1701   HOWTO (R_MIPS16_GOT16,	/* type */
   1702 	 0,			/* rightshift */
   1703 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1704 	 16,			/* bitsize */
   1705 	 FALSE,			/* pc_relative */
   1706 	 0,			/* bitpos */
   1707 	 complain_overflow_dont, /* complain_on_overflow */
   1708 	 _bfd_mips_elf_got16_reloc, /* special_function */
   1709 	 "R_MIPS16_GOT16",	/* name */
   1710 	 FALSE,			/* partial_inplace */
   1711 	 0,			/* src_mask */
   1712 	 0x0000ffff,	        /* dst_mask */
   1713 	 FALSE),		/* pcrel_offset */
   1714 
   1715   /* A MIPS16 call through the global offset table.  */
   1716   HOWTO (R_MIPS16_CALL16,	/* type */
   1717 	 0,			/* rightshift */
   1718 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1719 	 16,			/* bitsize */
   1720 	 FALSE,			/* pc_relative */
   1721 	 0,			/* bitpos */
   1722 	 complain_overflow_dont, /* complain_on_overflow */
   1723 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1724 	 "R_MIPS16_CALL16",	/* name */
   1725 	 FALSE,			/* partial_inplace */
   1726 	 0,			/* src_mask */
   1727 	 0x0000ffff,	        /* dst_mask */
   1728 	 FALSE),		/* pcrel_offset */
   1729 
   1730   /* MIPS16 high 16 bits of symbol value.  */
   1731   HOWTO (R_MIPS16_HI16,		/* type */
   1732 	 16,			/* rightshift */
   1733 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1734 	 16,			/* bitsize */
   1735 	 FALSE,			/* pc_relative */
   1736 	 0,			/* bitpos */
   1737 	 complain_overflow_dont, /* complain_on_overflow */
   1738 	 _bfd_mips_elf_hi16_reloc, /* special_function */
   1739 	 "R_MIPS16_HI16",	/* name */
   1740 	 FALSE,			/* partial_inplace */
   1741 	 0,			/* src_mask */
   1742 	 0x0000ffff,		/* dst_mask */
   1743 	 FALSE),		/* pcrel_offset */
   1744 
   1745   /* MIPS16 low 16 bits of symbol value.  */
   1746   HOWTO (R_MIPS16_LO16,		/* type */
   1747 	 0,			/* rightshift */
   1748 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1749 	 16,			/* bitsize */
   1750 	 FALSE,			/* pc_relative */
   1751 	 0,			/* bitpos */
   1752 	 complain_overflow_dont, /* complain_on_overflow */
   1753 	 _bfd_mips_elf_lo16_reloc, /* special_function */
   1754 	 "R_MIPS16_LO16",	/* name */
   1755 	 FALSE,			/* partial_inplace */
   1756 	 0,			/* src_mask */
   1757 	 0x0000ffff,		/* dst_mask */
   1758 	 FALSE),		/* pcrel_offset */
   1759 
   1760   /* MIPS16 TLS general dynamic variable reference.  */
   1761   HOWTO (R_MIPS16_TLS_GD,	/* type */
   1762 	 0,			/* rightshift */
   1763 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1764 	 16,			/* bitsize */
   1765 	 FALSE,			/* pc_relative */
   1766 	 0,			/* bitpos */
   1767 	 complain_overflow_signed, /* complain_on_overflow */
   1768 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1769 	 "R_MIPS16_TLS_GD",	/* name */
   1770 	 FALSE,			/* partial_inplace */
   1771 	 0,			/* src_mask */
   1772 	 0x0000ffff,		/* dst_mask */
   1773 	 FALSE),		/* pcrel_offset */
   1774 
   1775   /* MIPS16 TLS local dynamic variable reference.  */
   1776   HOWTO (R_MIPS16_TLS_LDM,	/* type */
   1777 	 0,			/* rightshift */
   1778 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1779 	 16,			/* bitsize */
   1780 	 FALSE,			/* pc_relative */
   1781 	 0,			/* bitpos */
   1782 	 complain_overflow_signed, /* complain_on_overflow */
   1783 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1784 	 "R_MIPS16_TLS_LDM",	/* name */
   1785 	 FALSE,			/* partial_inplace */
   1786 	 0,			/* src_mask */
   1787 	 0x0000ffff,		/* dst_mask */
   1788 	 FALSE),		/* pcrel_offset */
   1789 
   1790   /* MIPS16 TLS local dynamic offset.  */
   1791   HOWTO (R_MIPS16_TLS_DTPREL_HI16,	/* type */
   1792 	 0,			/* rightshift */
   1793 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1794 	 16,			/* bitsize */
   1795 	 FALSE,			/* pc_relative */
   1796 	 0,			/* bitpos */
   1797 	 complain_overflow_signed, /* complain_on_overflow */
   1798 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1799 	 "R_MIPS16_TLS_DTPREL_HI16",	/* name */
   1800 	 FALSE,			/* partial_inplace */
   1801 	 0,			/* src_mask */
   1802 	 0x0000ffff,		/* dst_mask */
   1803 	 FALSE),		/* pcrel_offset */
   1804 
   1805   /* MIPS16 TLS local dynamic offset.  */
   1806   HOWTO (R_MIPS16_TLS_DTPREL_LO16,	/* type */
   1807 	 0,			/* rightshift */
   1808 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1809 	 16,			/* bitsize */
   1810 	 FALSE,			/* pc_relative */
   1811 	 0,			/* bitpos */
   1812 	 complain_overflow_signed, /* complain_on_overflow */
   1813 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1814 	 "R_MIPS16_TLS_DTPREL_LO16",	/* name */
   1815 	 FALSE,			/* partial_inplace */
   1816 	 0,			/* src_mask */
   1817 	 0x0000ffff,		/* dst_mask */
   1818 	 FALSE),		/* pcrel_offset */
   1819 
   1820   /* MIPS16 TLS thread pointer offset.  */
   1821   HOWTO (R_MIPS16_TLS_GOTTPREL,	/* type */
   1822 	 0,			/* rightshift */
   1823 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1824 	 16,			/* bitsize */
   1825 	 FALSE,			/* pc_relative */
   1826 	 0,			/* bitpos */
   1827 	 complain_overflow_signed, /* complain_on_overflow */
   1828 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1829 	 "R_MIPS16_TLS_GOTTPREL",	/* name */
   1830 	 FALSE,			/* partial_inplace */
   1831 	 0,			/* src_mask */
   1832 	 0x0000ffff,		/* dst_mask */
   1833 	 FALSE),		/* pcrel_offset */
   1834 
   1835   /* MIPS16 TLS thread pointer offset.  */
   1836   HOWTO (R_MIPS16_TLS_TPREL_HI16,	/* type */
   1837 	 0,			/* rightshift */
   1838 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1839 	 16,			/* bitsize */
   1840 	 FALSE,			/* pc_relative */
   1841 	 0,			/* bitpos */
   1842 	 complain_overflow_signed, /* complain_on_overflow */
   1843 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1844 	 "R_MIPS16_TLS_TPREL_HI16", /* name */
   1845 	 FALSE,			/* partial_inplace */
   1846 	 0,			/* src_mask */
   1847 	 0x0000ffff,		/* dst_mask */
   1848 	 FALSE),		/* pcrel_offset */
   1849 
   1850   /* MIPS16 TLS thread pointer offset.  */
   1851   HOWTO (R_MIPS16_TLS_TPREL_LO16,	/* type */
   1852 	 0,			/* rightshift */
   1853 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1854 	 16,			/* bitsize */
   1855 	 FALSE,			/* pc_relative */
   1856 	 0,			/* bitpos */
   1857 	 complain_overflow_signed, /* complain_on_overflow */
   1858 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1859 	 "R_MIPS16_TLS_TPREL_LO16", /* name */
   1860 	 FALSE,			/* partial_inplace */
   1861 	 0,			/* src_mask */
   1862 	 0x0000ffff,		/* dst_mask */
   1863 	 FALSE),		/* pcrel_offset */
   1864 };
   1865 
   1866 static reloc_howto_type elf_micromips_howto_table_rel[] =
   1867 {
   1868   EMPTY_HOWTO (130),
   1869   EMPTY_HOWTO (131),
   1870   EMPTY_HOWTO (132),
   1871 
   1872   /* 26 bit jump address.  */
   1873   HOWTO (R_MICROMIPS_26_S1,	/* type */
   1874 	 1,			/* rightshift */
   1875 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1876 	 26,			/* bitsize */
   1877 	 FALSE,			/* pc_relative */
   1878 	 0,			/* bitpos */
   1879 	 complain_overflow_dont, /* complain_on_overflow */
   1880 	 			/* This needs complex overflow
   1881 				   detection, because the upper four
   1882 				   bits must match the PC.  */
   1883 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1884 	 "R_MICROMIPS_26_S1",	/* name */
   1885 	 TRUE,			/* partial_inplace */
   1886 	 0x3ffffff,		/* src_mask */
   1887 	 0x3ffffff,		/* dst_mask */
   1888 	 FALSE),		/* pcrel_offset */
   1889 
   1890   /* High 16 bits of symbol value.  */
   1891   HOWTO (R_MICROMIPS_HI16,	/* type */
   1892 	 16,			/* rightshift */
   1893 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1894 	 16,			/* bitsize */
   1895 	 FALSE,			/* pc_relative */
   1896 	 0,			/* bitpos */
   1897 	 complain_overflow_dont, /* complain_on_overflow */
   1898 	 _bfd_mips_elf_hi16_reloc, /* special_function */
   1899 	 "R_MICROMIPS_HI16",	/* name */
   1900 	 TRUE,			/* partial_inplace */
   1901 	 0x0000ffff,		/* src_mask */
   1902 	 0x0000ffff,		/* dst_mask */
   1903 	 FALSE),		/* pcrel_offset */
   1904 
   1905   /* Low 16 bits of symbol value.  */
   1906   HOWTO (R_MICROMIPS_LO16,	/* type */
   1907 	 0,			/* rightshift */
   1908 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1909 	 16,			/* bitsize */
   1910 	 FALSE,			/* pc_relative */
   1911 	 0,			/* bitpos */
   1912 	 complain_overflow_dont, /* complain_on_overflow */
   1913 	 _bfd_mips_elf_lo16_reloc, /* special_function */
   1914 	 "R_MICROMIPS_LO16",	/* name */
   1915 	 TRUE,			/* partial_inplace */
   1916 	 0x0000ffff,		/* src_mask */
   1917 	 0x0000ffff,		/* dst_mask */
   1918 	 FALSE),		/* pcrel_offset */
   1919 
   1920   /* GP relative reference.  */
   1921   HOWTO (R_MICROMIPS_GPREL16,	/* type */
   1922 	 0,			/* rightshift */
   1923 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1924 	 16,			/* bitsize */
   1925 	 FALSE,			/* pc_relative */
   1926 	 0,			/* bitpos */
   1927 	 complain_overflow_signed, /* complain_on_overflow */
   1928 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
   1929 	 "R_MICROMIPS_GPREL16",	/* name */
   1930 	 TRUE,			/* partial_inplace */
   1931 	 0x0000ffff,		/* src_mask */
   1932 	 0x0000ffff,		/* dst_mask */
   1933 	 FALSE),		/* pcrel_offset */
   1934 
   1935   /* Reference to literal section.  */
   1936   HOWTO (R_MICROMIPS_LITERAL,	/* type */
   1937 	 0,			/* rightshift */
   1938 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1939 	 16,			/* bitsize */
   1940 	 FALSE,			/* pc_relative */
   1941 	 0,			/* bitpos */
   1942 	 complain_overflow_signed, /* complain_on_overflow */
   1943 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
   1944 	 "R_MICROMIPS_LITERAL",	/* name */
   1945 	 TRUE,			/* partial_inplace */
   1946 	 0x0000ffff,		/* src_mask */
   1947 	 0x0000ffff,		/* dst_mask */
   1948 	 FALSE),		/* pcrel_offset */
   1949 
   1950   /* Reference to global offset table.  */
   1951   HOWTO (R_MICROMIPS_GOT16,	/* type */
   1952 	 0,			/* rightshift */
   1953 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1954 	 16,			/* bitsize */
   1955 	 FALSE,			/* pc_relative */
   1956 	 0,			/* bitpos */
   1957 	 complain_overflow_signed, /* complain_on_overflow */
   1958 	 _bfd_mips_elf_got16_reloc, /* special_function */
   1959 	 "R_MICROMIPS_GOT16",	/* name */
   1960 	 TRUE,			/* partial_inplace */
   1961 	 0x0000ffff,		/* src_mask */
   1962 	 0x0000ffff,		/* dst_mask */
   1963 	 FALSE),		/* pcrel_offset */
   1964 
   1965   /* This is for microMIPS branches.  */
   1966   HOWTO (R_MICROMIPS_PC7_S1,	/* type */
   1967 	 1,			/* rightshift */
   1968 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1969 	 7,			/* bitsize */
   1970 	 TRUE,			/* pc_relative */
   1971 	 0,			/* bitpos */
   1972 	 complain_overflow_signed, /* complain_on_overflow */
   1973 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1974 	 "R_MICROMIPS_PC7_S1",	/* name */
   1975 	 TRUE,			/* partial_inplace */
   1976 	 0x0000007f,		/* src_mask */
   1977 	 0x0000007f,		/* dst_mask */
   1978 	 TRUE),			/* pcrel_offset */
   1979 
   1980   HOWTO (R_MICROMIPS_PC10_S1,	/* type */
   1981 	 1,			/* rightshift */
   1982 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1983 	 10,			/* bitsize */
   1984 	 TRUE,			/* pc_relative */
   1985 	 0,			/* bitpos */
   1986 	 complain_overflow_signed, /* complain_on_overflow */
   1987 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1988 	 "R_MICROMIPS_PC10_S1",	/* name */
   1989 	 TRUE,			/* partial_inplace */
   1990 	 0x000003ff,		/* src_mask */
   1991 	 0x000003ff,		/* dst_mask */
   1992 	 TRUE),			/* pcrel_offset */
   1993 
   1994   HOWTO (R_MICROMIPS_PC16_S1,	/* type */
   1995 	 1,			/* rightshift */
   1996 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1997 	 16,			/* bitsize */
   1998 	 TRUE,			/* pc_relative */
   1999 	 0,			/* bitpos */
   2000 	 complain_overflow_signed, /* complain_on_overflow */
   2001 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2002 	 "R_MICROMIPS_PC16_S1",	/* name */
   2003 	 TRUE,			/* partial_inplace */
   2004 	 0x0000ffff,		/* src_mask */
   2005 	 0x0000ffff,		/* dst_mask */
   2006 	 TRUE),			/* pcrel_offset */
   2007 
   2008   /* 16 bit call through global offset table.  */
   2009   HOWTO (R_MICROMIPS_CALL16,	/* type */
   2010 	 0,			/* rightshift */
   2011 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2012 	 16,			/* bitsize */
   2013 	 FALSE,			/* pc_relative */
   2014 	 0,			/* bitpos */
   2015 	 complain_overflow_signed, /* complain_on_overflow */
   2016 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2017 	 "R_MICROMIPS_CALL16",	/* name */
   2018 	 TRUE,			/* partial_inplace */
   2019 	 0x0000ffff,		/* src_mask */
   2020 	 0x0000ffff,		/* dst_mask */
   2021 	 FALSE),		/* pcrel_offset */
   2022 
   2023   EMPTY_HOWTO (143),
   2024   EMPTY_HOWTO (144),
   2025 
   2026   /* Displacement in the global offset table.  */
   2027   HOWTO (R_MICROMIPS_GOT_DISP,	/* type */
   2028 	 0,			/* rightshift */
   2029 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2030 	 16,			/* bitsize */
   2031 	 FALSE,			/* pc_relative */
   2032 	 0,			/* bitpos */
   2033 	 complain_overflow_signed, /* complain_on_overflow */
   2034 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2035 	 "R_MICROMIPS_GOT_DISP",/* name */
   2036 	 TRUE,			/* partial_inplace */
   2037 	 0x0000ffff,		/* src_mask */
   2038 	 0x0000ffff,		/* dst_mask */
   2039 	 FALSE),		/* pcrel_offset */
   2040 
   2041   /* Displacement to page pointer in the global offset table.  */
   2042   HOWTO (R_MICROMIPS_GOT_PAGE,	/* type */
   2043 	 0,			/* rightshift */
   2044 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2045 	 16,			/* bitsize */
   2046 	 FALSE,			/* pc_relative */
   2047 	 0,			/* bitpos */
   2048 	 complain_overflow_signed, /* complain_on_overflow */
   2049 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2050 	 "R_MICROMIPS_GOT_PAGE",/* name */
   2051 	 TRUE,			/* partial_inplace */
   2052 	 0x0000ffff,		/* src_mask */
   2053 	 0x0000ffff,		/* dst_mask */
   2054 	 FALSE),		/* pcrel_offset */
   2055 
   2056   /* Offset from page pointer in the global offset table.  */
   2057   HOWTO (R_MICROMIPS_GOT_OFST,	/* type */
   2058 	 0,			/* rightshift */
   2059 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2060 	 16,			/* bitsize */
   2061 	 FALSE,			/* pc_relative */
   2062 	 0,			/* bitpos */
   2063 	 complain_overflow_signed, /* complain_on_overflow */
   2064 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2065 	 "R_MICROMIPS_GOT_OFST",/* name */
   2066 	 TRUE,			/* partial_inplace */
   2067 	 0x0000ffff,		/* src_mask */
   2068 	 0x0000ffff,		/* dst_mask */
   2069 	 FALSE),		/* pcrel_offset */
   2070 
   2071   /* High 16 bits of displacement in global offset table.  */
   2072   HOWTO (R_MICROMIPS_GOT_HI16,	/* type */
   2073 	 0,			/* rightshift */
   2074 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2075 	 16,			/* bitsize */
   2076 	 FALSE,			/* pc_relative */
   2077 	 0,			/* bitpos */
   2078 	 complain_overflow_dont, /* complain_on_overflow */
   2079 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2080 	 "R_MICROMIPS_GOT_HI16",/* name */
   2081 	 TRUE,			/* partial_inplace */
   2082 	 0x0000ffff,		/* src_mask */
   2083 	 0x0000ffff,		/* dst_mask */
   2084 	 FALSE),		/* pcrel_offset */
   2085 
   2086   /* Low 16 bits of displacement in global offset table.  */
   2087   HOWTO (R_MICROMIPS_GOT_LO16,	/* type */
   2088 	 0,			/* rightshift */
   2089 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2090 	 16,			/* bitsize */
   2091 	 FALSE,			/* pc_relative */
   2092 	 0,			/* bitpos */
   2093 	 complain_overflow_dont, /* complain_on_overflow */
   2094 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2095 	 "R_MICROMIPS_GOT_LO16",/* name */
   2096 	 TRUE,			/* partial_inplace */
   2097 	 0x0000ffff,		/* src_mask */
   2098 	 0x0000ffff,		/* dst_mask */
   2099 	 FALSE),		/* pcrel_offset */
   2100 
   2101   /* 64 bit subtraction.  Used in the N32 ABI.  */
   2102   HOWTO (R_MICROMIPS_SUB,	/* type */
   2103 	 0,			/* rightshift */
   2104 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   2105 	 64,			/* bitsize */
   2106 	 FALSE,			/* pc_relative */
   2107 	 0,			/* bitpos */
   2108 	 complain_overflow_dont, /* complain_on_overflow */
   2109 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2110 	 "R_MICROMIPS_SUB",	/* name */
   2111 	 TRUE,			/* partial_inplace */
   2112 	 MINUS_ONE,		/* src_mask */
   2113 	 MINUS_ONE,		/* dst_mask */
   2114 	 FALSE),		/* pcrel_offset */
   2115 
   2116   /* We don't support these for REL relocations, because it means building
   2117      the addend from a R_MICROMIPS_HIGHEST/R_MICROMIPS_HIGHER/
   2118      R_MICROMIPS_HI16/R_MICROMIPS_LO16 sequence with varying ordering,
   2119      using fallable heuristics.  */
   2120   EMPTY_HOWTO (R_MICROMIPS_HIGHER),
   2121   EMPTY_HOWTO (R_MICROMIPS_HIGHEST),
   2122 
   2123   /* High 16 bits of displacement in global offset table.  */
   2124   HOWTO (R_MICROMIPS_CALL_HI16,	/* type */
   2125 	 0,			/* rightshift */
   2126 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2127 	 16,			/* bitsize */
   2128 	 FALSE,			/* pc_relative */
   2129 	 0,			/* bitpos */
   2130 	 complain_overflow_dont, /* complain_on_overflow */
   2131 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2132 	 "R_MICROMIPS_CALL_HI16",/* name */
   2133 	 TRUE,			/* partial_inplace */
   2134 	 0x0000ffff,		/* src_mask */
   2135 	 0x0000ffff,		/* dst_mask */
   2136 	 FALSE),		/* pcrel_offset */
   2137 
   2138   /* Low 16 bits of displacement in global offset table.  */
   2139   HOWTO (R_MICROMIPS_CALL_LO16,	/* type */
   2140 	 0,			/* rightshift */
   2141 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2142 	 16,			/* bitsize */
   2143 	 FALSE,			/* pc_relative */
   2144 	 0,			/* bitpos */
   2145 	 complain_overflow_dont, /* complain_on_overflow */
   2146 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2147 	 "R_MICROMIPS_CALL_LO16",/* name */
   2148 	 TRUE,			/* partial_inplace */
   2149 	 0x0000ffff,		/* src_mask */
   2150 	 0x0000ffff,		/* dst_mask */
   2151 	 FALSE),		/* pcrel_offset */
   2152 
   2153   /* Section displacement.  */
   2154   HOWTO (R_MICROMIPS_SCN_DISP,  /* type */
   2155 	 0,			/* rightshift */
   2156 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2157 	 32,			/* bitsize */
   2158 	 FALSE,			/* pc_relative */
   2159 	 0,			/* bitpos */
   2160 	 complain_overflow_dont, /* complain_on_overflow */
   2161 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2162 	 "R_MICROMIPS_SCN_DISP", /* name */
   2163 	 TRUE,			/* partial_inplace */
   2164 	 0xffffffff,		/* src_mask */
   2165 	 0xffffffff,		/* dst_mask */
   2166 	 FALSE),		/* pcrel_offset */
   2167 
   2168   /* Protected jump conversion.  This is an optimization hint.  No
   2169      relocation is required for correctness.  */
   2170   HOWTO (R_MICROMIPS_JALR,	/* type */
   2171 	 0,			/* rightshift */
   2172 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2173 	 32,			/* bitsize */
   2174 	 FALSE,			/* pc_relative */
   2175 	 0,			/* bitpos */
   2176 	 complain_overflow_dont, /* complain_on_overflow */
   2177 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2178 	 "R_MICROMIPS_JALR",	/* name */
   2179 	 FALSE,			/* partial_inplace */
   2180 	 0,			/* src_mask */
   2181 	 0x00000000,		/* dst_mask */
   2182 	 FALSE),		/* pcrel_offset */
   2183 };
   2184 
   2185 static reloc_howto_type elf_micromips_howto_table_rela[] =
   2186 {
   2187   EMPTY_HOWTO (130),
   2188   EMPTY_HOWTO (131),
   2189   EMPTY_HOWTO (132),
   2190 
   2191   /* 26 bit jump address.  */
   2192   HOWTO (R_MICROMIPS_26_S1,	/* type */
   2193 	 1,			/* rightshift */
   2194 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2195 	 26,			/* bitsize */
   2196 	 FALSE,			/* pc_relative */
   2197 	 0,			/* bitpos */
   2198 	 complain_overflow_dont, /* complain_on_overflow */
   2199 	 			/* This needs complex overflow
   2200 				   detection, because the upper four
   2201 				   bits must match the PC.  */
   2202 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2203 	 "R_MICROMIPS_26_S1",	/* name */
   2204 	 FALSE,			/* partial_inplace */
   2205 	 0,			/* src_mask */
   2206 	 0x3ffffff,		/* dst_mask */
   2207 	 FALSE),		/* pcrel_offset */
   2208 
   2209   /* High 16 bits of symbol value.  */
   2210   HOWTO (R_MICROMIPS_HI16,	/* type */
   2211 	 16,			/* rightshift */
   2212 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2213 	 16,			/* bitsize */
   2214 	 FALSE,			/* pc_relative */
   2215 	 0,			/* bitpos */
   2216 	 complain_overflow_dont, /* complain_on_overflow */
   2217 	 _bfd_mips_elf_hi16_reloc, /* special_function */
   2218 	 "R_MICROMIPS_HI16",	/* name */
   2219 	 FALSE,			/* partial_inplace */
   2220 	 0,			/* src_mask */
   2221 	 0x0000ffff,		/* dst_mask */
   2222 	 FALSE),		/* pcrel_offset */
   2223 
   2224   /* Low 16 bits of symbol value.  */
   2225   HOWTO (R_MICROMIPS_LO16,	/* type */
   2226 	 0,			/* rightshift */
   2227 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2228 	 16,			/* bitsize */
   2229 	 FALSE,			/* pc_relative */
   2230 	 0,			/* bitpos */
   2231 	 complain_overflow_dont, /* complain_on_overflow */
   2232 	 _bfd_mips_elf_lo16_reloc, /* special_function */
   2233 	 "R_MICROMIPS_LO16",	/* name */
   2234 	 FALSE,			/* partial_inplace */
   2235 	 0,			/* src_mask */
   2236 	 0x0000ffff,		/* dst_mask */
   2237 	 FALSE),		/* pcrel_offset */
   2238 
   2239   /* GP relative reference.  */
   2240   HOWTO (R_MICROMIPS_GPREL16,	/* type */
   2241 	 0,			/* rightshift */
   2242 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2243 	 16,			/* bitsize */
   2244 	 FALSE,			/* pc_relative */
   2245 	 0,			/* bitpos */
   2246 	 complain_overflow_signed, /* complain_on_overflow */
   2247 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
   2248 	 "R_MICROMIPS_GPREL16",	/* name */
   2249 	 FALSE,			/* partial_inplace */
   2250 	 0,			/* src_mask */
   2251 	 0x0000ffff,		/* dst_mask */
   2252 	 FALSE),		/* pcrel_offset */
   2253 
   2254   /* Reference to literal section.  */
   2255   HOWTO (R_MICROMIPS_LITERAL,	/* type */
   2256 	 0,			/* rightshift */
   2257 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2258 	 16,			/* bitsize */
   2259 	 FALSE,			/* pc_relative */
   2260 	 0,			/* bitpos */
   2261 	 complain_overflow_signed, /* complain_on_overflow */
   2262 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
   2263 	 "R_MICROMIPS_LITERAL",	/* name */
   2264 	 FALSE,			/* partial_inplace */
   2265 	 0,			/* src_mask */
   2266 	 0x0000ffff,		/* dst_mask */
   2267 	 FALSE),		/* pcrel_offset */
   2268 
   2269   /* Reference to global offset table.  */
   2270   HOWTO (R_MICROMIPS_GOT16,	/* type */
   2271 	 0,			/* rightshift */
   2272 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2273 	 16,			/* bitsize */
   2274 	 FALSE,			/* pc_relative */
   2275 	 0,			/* bitpos */
   2276 	 complain_overflow_signed, /* complain_on_overflow */
   2277 	 _bfd_mips_elf_got16_reloc, /* special_function */
   2278 	 "R_MICROMIPS_GOT16",	/* name */
   2279 	 FALSE,			/* partial_inplace */
   2280 	 0,			/* src_mask */
   2281 	 0x0000ffff,		/* dst_mask */
   2282 	 FALSE),		/* pcrel_offset */
   2283 
   2284   /* This is for microMIPS branches.  */
   2285   HOWTO (R_MICROMIPS_PC7_S1,	/* type */
   2286 	 1,			/* rightshift */
   2287 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   2288 	 7,			/* bitsize */
   2289 	 TRUE,			/* pc_relative */
   2290 	 0,			/* bitpos */
   2291 	 complain_overflow_signed, /* complain_on_overflow */
   2292 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2293 	 "R_MICROMIPS_PC7_S1",	/* name */
   2294 	 FALSE,			/* partial_inplace */
   2295 	 0,			/* src_mask */
   2296 	 0x0000007f,		/* dst_mask */
   2297 	 TRUE),			/* pcrel_offset */
   2298 
   2299   HOWTO (R_MICROMIPS_PC10_S1,	/* type */
   2300 	 1,			/* rightshift */
   2301 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   2302 	 10,			/* bitsize */
   2303 	 TRUE,			/* pc_relative */
   2304 	 0,			/* bitpos */
   2305 	 complain_overflow_signed, /* complain_on_overflow */
   2306 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2307 	 "R_MICROMIPS_PC10_S1",	/* name */
   2308 	 FALSE,			/* partial_inplace */
   2309 	 0,			/* src_mask */
   2310 	 0x000003ff,		/* dst_mask */
   2311 	 TRUE),			/* pcrel_offset */
   2312 
   2313   HOWTO (R_MICROMIPS_PC16_S1,	/* type */
   2314 	 1,			/* rightshift */
   2315 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2316 	 16,			/* bitsize */
   2317 	 TRUE,			/* pc_relative */
   2318 	 0,			/* bitpos */
   2319 	 complain_overflow_signed, /* complain_on_overflow */
   2320 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2321 	 "R_MICROMIPS_PC16_S1",	/* name */
   2322 	 FALSE,			/* partial_inplace */
   2323 	 0,			/* src_mask */
   2324 	 0x0000ffff,		/* dst_mask */
   2325 	 TRUE),			/* pcrel_offset */
   2326 
   2327   /* 16 bit call through global offset table.  */
   2328   HOWTO (R_MICROMIPS_CALL16,	/* type */
   2329 	 0,			/* rightshift */
   2330 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2331 	 16,			/* bitsize */
   2332 	 FALSE,			/* pc_relative */
   2333 	 0,			/* bitpos */
   2334 	 complain_overflow_signed, /* complain_on_overflow */
   2335 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2336 	 "R_MICROMIPS_CALL16",	/* name */
   2337 	 FALSE,			/* partial_inplace */
   2338 	 0,			/* src_mask */
   2339 	 0x0000ffff,		/* dst_mask */
   2340 	 FALSE),		/* pcrel_offset */
   2341 
   2342   EMPTY_HOWTO (143),
   2343   EMPTY_HOWTO (144),
   2344 
   2345   /* Displacement in the global offset table.  */
   2346   HOWTO (R_MICROMIPS_GOT_DISP,	/* type */
   2347 	 0,			/* rightshift */
   2348 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2349 	 16,			/* bitsize */
   2350 	 FALSE,			/* pc_relative */
   2351 	 0,			/* bitpos */
   2352 	 complain_overflow_signed, /* complain_on_overflow */
   2353 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2354 	 "R_MICROMIPS_GOT_DISP",/* name */
   2355 	 FALSE,			/* partial_inplace */
   2356 	 0,			/* src_mask */
   2357 	 0x0000ffff,		/* dst_mask */
   2358 	 FALSE),		/* pcrel_offset */
   2359 
   2360   /* Displacement to page pointer in the global offset table.  */
   2361   HOWTO (R_MICROMIPS_GOT_PAGE,	/* type */
   2362 	 0,			/* rightshift */
   2363 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2364 	 16,			/* bitsize */
   2365 	 FALSE,			/* pc_relative */
   2366 	 0,			/* bitpos */
   2367 	 complain_overflow_signed, /* complain_on_overflow */
   2368 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2369 	 "R_MICROMIPS_GOT_PAGE",/* name */
   2370 	 FALSE,			/* partial_inplace */
   2371 	 0,			/* src_mask */
   2372 	 0x0000ffff,		/* dst_mask */
   2373 	 FALSE),		/* pcrel_offset */
   2374 
   2375   /* Offset from page pointer in the global offset table.  */
   2376   HOWTO (R_MICROMIPS_GOT_OFST,	/* type */
   2377 	 0,			/* rightshift */
   2378 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2379 	 16,			/* bitsize */
   2380 	 FALSE,			/* pc_relative */
   2381 	 0,			/* bitpos */
   2382 	 complain_overflow_signed, /* complain_on_overflow */
   2383 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2384 	 "R_MICROMIPS_GOT_OFST",/* name */
   2385 	 FALSE,			/* partial_inplace */
   2386 	 0,			/* src_mask */
   2387 	 0x0000ffff,		/* dst_mask */
   2388 	 FALSE),		/* pcrel_offset */
   2389 
   2390   /* High 16 bits of displacement in global offset table.  */
   2391   HOWTO (R_MICROMIPS_GOT_HI16,	/* type */
   2392 	 0,			/* rightshift */
   2393 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2394 	 16,			/* bitsize */
   2395 	 FALSE,			/* pc_relative */
   2396 	 0,			/* bitpos */
   2397 	 complain_overflow_dont, /* complain_on_overflow */
   2398 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2399 	 "R_MICROMIPS_GOT_HI16",/* name */
   2400 	 FALSE,			/* partial_inplace */
   2401 	 0,			/* src_mask */
   2402 	 0x0000ffff,		/* dst_mask */
   2403 	 FALSE),		/* pcrel_offset */
   2404 
   2405   /* Low 16 bits of displacement in global offset table.  */
   2406   HOWTO (R_MICROMIPS_GOT_LO16,	/* type */
   2407 	 0,			/* rightshift */
   2408 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2409 	 16,			/* bitsize */
   2410 	 FALSE,			/* pc_relative */
   2411 	 0,			/* bitpos */
   2412 	 complain_overflow_dont, /* complain_on_overflow */
   2413 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2414 	 "R_MICROMIPS_GOT_LO16",/* name */
   2415 	 FALSE,			/* partial_inplace */
   2416 	 0,			/* src_mask */
   2417 	 0x0000ffff,		/* dst_mask */
   2418 	 FALSE),		/* pcrel_offset */
   2419 
   2420   /* 64 bit subtraction.  Used in the N32 ABI.  */
   2421   HOWTO (R_MICROMIPS_SUB,	/* type */
   2422 	 0,			/* rightshift */
   2423 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   2424 	 64,			/* bitsize */
   2425 	 FALSE,			/* pc_relative */
   2426 	 0,			/* bitpos */
   2427 	 complain_overflow_dont, /* complain_on_overflow */
   2428 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2429 	 "R_MICROMIPS_SUB",	/* name */
   2430 	 FALSE,			/* partial_inplace */
   2431 	 0,			/* src_mask */
   2432 	 MINUS_ONE,		/* dst_mask */
   2433 	 FALSE),		/* pcrel_offset */
   2434 
   2435   /* Get the higher value of a 64 bit addend.  */
   2436   HOWTO (R_MICROMIPS_HIGHER,	/* type */
   2437 	 0,			/* rightshift */
   2438 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2439 	 16,			/* bitsize */
   2440 	 FALSE,			/* pc_relative */
   2441 	 0,			/* bitpos */
   2442 	 complain_overflow_dont, /* complain_on_overflow */
   2443 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2444 	 "R_MICROMIPS_HIGHER",	/* name */
   2445 	 FALSE,			/* partial_inplace */
   2446 	 0,			/* src_mask */
   2447 	 0x0000ffff,		/* dst_mask */
   2448 	 FALSE),		/* pcrel_offset */
   2449 
   2450   /* Get the highest value of a 64 bit addend.  */
   2451   HOWTO (R_MICROMIPS_HIGHEST,	/* type */
   2452 	 0,			/* rightshift */
   2453 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2454 	 16,			/* bitsize */
   2455 	 FALSE,			/* pc_relative */
   2456 	 0,			/* bitpos */
   2457 	 complain_overflow_dont, /* complain_on_overflow */
   2458 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2459 	 "R_MICROMIPS_HIGHEST",	/* name */
   2460 	 FALSE,			/* partial_inplace */
   2461 	 0,			/* src_mask */
   2462 	 0x0000ffff,		/* dst_mask */
   2463 	 FALSE),		/* pcrel_offset */
   2464 
   2465   /* High 16 bits of displacement in global offset table.  */
   2466   HOWTO (R_MICROMIPS_CALL_HI16,	/* type */
   2467 	 0,			/* rightshift */
   2468 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2469 	 16,			/* bitsize */
   2470 	 FALSE,			/* pc_relative */
   2471 	 0,			/* bitpos */
   2472 	 complain_overflow_dont, /* complain_on_overflow */
   2473 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2474 	 "R_MICROMIPS_CALL_HI16",/* name */
   2475 	 FALSE,			/* partial_inplace */
   2476 	 0,			/* src_mask */
   2477 	 0x0000ffff,		/* dst_mask */
   2478 	 FALSE),		/* pcrel_offset */
   2479 
   2480   /* Low 16 bits of displacement in global offset table.  */
   2481   HOWTO (R_MICROMIPS_CALL_LO16,	/* type */
   2482 	 0,			/* rightshift */
   2483 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2484 	 16,			/* bitsize */
   2485 	 FALSE,			/* pc_relative */
   2486 	 0,			/* bitpos */
   2487 	 complain_overflow_dont, /* complain_on_overflow */
   2488 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2489 	 "R_MICROMIPS_CALL_LO16",/* name */
   2490 	 FALSE,			/* partial_inplace */
   2491 	 0,			/* src_mask */
   2492 	 0x0000ffff,		/* dst_mask */
   2493 	 FALSE),		/* pcrel_offset */
   2494 
   2495   /* Section displacement.  */
   2496   HOWTO (R_MICROMIPS_SCN_DISP,  /* type */
   2497 	 0,			/* rightshift */
   2498 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2499 	 32,			/* bitsize */
   2500 	 FALSE,			/* pc_relative */
   2501 	 0,			/* bitpos */
   2502 	 complain_overflow_dont, /* complain_on_overflow */
   2503 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2504 	 "R_MICROMIPS_SCN_DISP", /* name */
   2505 	 FALSE,			/* partial_inplace */
   2506 	 0,			/* src_mask */
   2507 	 0xffffffff,		/* dst_mask */
   2508 	 FALSE),		/* pcrel_offset */
   2509 
   2510   /* Protected jump conversion.  This is an optimization hint.  No
   2511      relocation is required for correctness.  */
   2512   HOWTO (R_MICROMIPS_JALR,	/* type */
   2513 	 0,			/* rightshift */
   2514 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2515 	 32,			/* bitsize */
   2516 	 FALSE,			/* pc_relative */
   2517 	 0,			/* bitpos */
   2518 	 complain_overflow_dont, /* complain_on_overflow */
   2519 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2520 	 "R_MICROMIPS_JALR",	/* name */
   2521 	 FALSE,			/* partial_inplace */
   2522 	 0,			/* src_mask */
   2523 	 0x00000000,		/* dst_mask */
   2524 	 FALSE),		/* pcrel_offset */
   2525 };
   2526 
   2527 /* GNU extension to record C++ vtable hierarchy */
   2528 static reloc_howto_type elf_mips_gnu_vtinherit_howto =
   2529   HOWTO (R_MIPS_GNU_VTINHERIT,	/* type */
   2530 	 0,			/* rightshift */
   2531 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2532 	 0,			/* bitsize */
   2533 	 FALSE,			/* pc_relative */
   2534 	 0,			/* bitpos */
   2535 	 complain_overflow_dont, /* complain_on_overflow */
   2536 	 NULL,			/* special_function */
   2537 	 "R_MIPS_GNU_VTINHERIT", /* name */
   2538 	 FALSE,			/* partial_inplace */
   2539 	 0,			/* src_mask */
   2540 	 0,			/* dst_mask */
   2541 	 FALSE);		/* pcrel_offset */
   2542 
   2543 /* GNU extension to record C++ vtable member usage */
   2544 static reloc_howto_type elf_mips_gnu_vtentry_howto =
   2545   HOWTO (R_MIPS_GNU_VTENTRY,	/* type */
   2546 	 0,			/* rightshift */
   2547 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2548 	 0,			/* bitsize */
   2549 	 FALSE,			/* pc_relative */
   2550 	 0,			/* bitpos */
   2551 	 complain_overflow_dont, /* complain_on_overflow */
   2552 	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
   2553 	 "R_MIPS_GNU_VTENTRY",	/* name */
   2554 	 FALSE,			/* partial_inplace */
   2555 	 0,			/* src_mask */
   2556 	 0,			/* dst_mask */
   2557 	 FALSE);		/* pcrel_offset */
   2558 
   2559 /* 16 bit offset for pc-relative branches.  */
   2561 static reloc_howto_type elf_mips_gnu_rel16_s2 =
   2562   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
   2563 	 2,			/* rightshift */
   2564 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2565 	 16,			/* bitsize */
   2566 	 TRUE,			/* pc_relative */
   2567 	 0,			/* bitpos */
   2568 	 complain_overflow_signed, /* complain_on_overflow */
   2569 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2570 	 "R_MIPS_GNU_REL16_S2",	/* name */
   2571 	 TRUE,			/* partial_inplace */
   2572 	 0x0000ffff,		/* src_mask */
   2573 	 0x0000ffff,		/* dst_mask */
   2574 	 TRUE);			/* pcrel_offset */
   2575 
   2576 /* 16 bit offset for pc-relative branches.  */
   2577 static reloc_howto_type elf_mips_gnu_rela16_s2 =
   2578   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
   2579 	 2,			/* rightshift */
   2580 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2581 	 16,			/* bitsize */
   2582 	 TRUE,			/* pc_relative */
   2583 	 0,			/* bitpos */
   2584 	 complain_overflow_signed, /* complain_on_overflow */
   2585 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2586 	 "R_MIPS_GNU_REL16_S2",	/* name */
   2587 	 FALSE,			/* partial_inplace */
   2588 	 0,			/* src_mask */
   2589 	 0x0000ffff,		/* dst_mask */
   2590 	 TRUE);			/* pcrel_offset */
   2591 
   2592 /* 32 bit pc-relative.  Used for compact EH tables.  */
   2593 static reloc_howto_type elf_mips_gnu_pcrel32 =
   2594   HOWTO (R_MIPS_PC32,		/* type */
   2595 	 0,			/* rightshift */
   2596 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2597 	 32,			/* bitsize */
   2598 	 TRUE,			/* pc_relative */
   2599 	 0,			/* bitpos */
   2600 	 complain_overflow_signed, /* complain_on_overflow */
   2601 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2602 	 "R_MIPS_PC32",		/* name */
   2603 	 TRUE,			/* partial_inplace */
   2604 	 0xffffffff,		/* src_mask */
   2605 	 0xffffffff,		/* dst_mask */
   2606 	 TRUE);			/* pcrel_offset */
   2607 
   2608 
   2609 /* Originally a VxWorks extension, but now used for other systems too.  */
   2611 static reloc_howto_type elf_mips_copy_howto =
   2612   HOWTO (R_MIPS_COPY,		/* type */
   2613 	 0,			/* rightshift */
   2614 	 0,			/* this one is variable size */
   2615 	 0,			/* bitsize */
   2616 	 FALSE,			/* pc_relative */
   2617 	 0,			/* bitpos */
   2618 	 complain_overflow_bitfield, /* complain_on_overflow */
   2619 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2620 	 "R_MIPS_COPY",		/* name */
   2621 	 FALSE,			/* partial_inplace */
   2622 	 0x0,         		/* src_mask */
   2623 	 0x0,		        /* dst_mask */
   2624 	 FALSE);		/* pcrel_offset */
   2625 
   2626 /* Originally a VxWorks extension, but now used for other systems too.  */
   2627 static reloc_howto_type elf_mips_jump_slot_howto =
   2628   HOWTO (R_MIPS_JUMP_SLOT,	/* type */
   2629 	 0,			/* rightshift */
   2630 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2631 	 32,			/* bitsize */
   2632 	 FALSE,			/* pc_relative */
   2633 	 0,			/* bitpos */
   2634 	 complain_overflow_bitfield, /* complain_on_overflow */
   2635 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2636 	 "R_MIPS_JUMP_SLOT",	/* name */
   2637 	 FALSE,			/* partial_inplace */
   2638 	 0x0,         		/* src_mask */
   2639 	 0x0,		        /* dst_mask */
   2640 	 FALSE);		/* pcrel_offset */
   2641 
   2642 /* Used in EH tables.  */
   2643 static reloc_howto_type elf_mips_eh_howto =
   2644   HOWTO (R_MIPS_EH,		/* type */
   2645 	 0,			/* rightshift */
   2646 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2647 	 32,			/* bitsize */
   2648 	 FALSE,			/* pc_relative */
   2649 	 0,			/* bitpos */
   2650 	 complain_overflow_signed, /* complain_on_overflow */
   2651 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2652 	 "R_MIPS_EH",		/* name */
   2653 	 TRUE,			/* partial_inplace */
   2654 	 0xffffffff,		/* src_mask */
   2655 	 0xffffffff,	        /* dst_mask */
   2656 	 FALSE);		/* pcrel_offset */
   2657 
   2658 
   2659 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
   2661    dangerous relocation.  */
   2662 
   2663 static bfd_boolean
   2664 mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
   2665 {
   2666   unsigned int count;
   2667   asymbol **sym;
   2668   unsigned int i;
   2669 
   2670   /* If we've already figured out what GP will be, just return it.  */
   2671   *pgp = _bfd_get_gp_value (output_bfd);
   2672   if (*pgp)
   2673     return TRUE;
   2674 
   2675   count = bfd_get_symcount (output_bfd);
   2676   sym = bfd_get_outsymbols (output_bfd);
   2677 
   2678   /* The linker script will have created a symbol named `_gp' with the
   2679      appropriate value.  */
   2680   if (sym == NULL)
   2681     i = count;
   2682   else
   2683     {
   2684       for (i = 0; i < count; i++, sym++)
   2685 	{
   2686 	  register const char *name;
   2687 
   2688 	  name = bfd_asymbol_name (*sym);
   2689 	  if (*name == '_' && strcmp (name, "_gp") == 0)
   2690 	    {
   2691 	      *pgp = bfd_asymbol_value (*sym);
   2692 	      _bfd_set_gp_value (output_bfd, *pgp);
   2693 	      break;
   2694 	    }
   2695 	}
   2696     }
   2697 
   2698   if (i >= count)
   2699     {
   2700       /* Only get the error once.  */
   2701       *pgp = 4;
   2702       _bfd_set_gp_value (output_bfd, *pgp);
   2703       return FALSE;
   2704     }
   2705 
   2706   return TRUE;
   2707 }
   2708 
   2709 /* We have to figure out the gp value, so that we can adjust the
   2710    symbol value correctly.  We look up the symbol _gp in the output
   2711    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
   2712    target data.  We don't need to adjust the symbol value for an
   2713    external symbol if we are producing relocatable output.  */
   2714 
   2715 static bfd_reloc_status_type
   2716 mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
   2717 		   char **error_message, bfd_vma *pgp)
   2718 {
   2719   if (bfd_is_und_section (symbol->section)
   2720       && ! relocatable)
   2721     {
   2722       *pgp = 0;
   2723       return bfd_reloc_undefined;
   2724     }
   2725 
   2726   *pgp = _bfd_get_gp_value (output_bfd);
   2727   if (*pgp == 0
   2728       && (! relocatable
   2729 	  || (symbol->flags & BSF_SECTION_SYM) != 0))
   2730     {
   2731       if (relocatable)
   2732 	{
   2733 	  /* Make up a value.  */
   2734 	  *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
   2735 	  _bfd_set_gp_value (output_bfd, *pgp);
   2736 	}
   2737       else if (!mips_elf_assign_gp (output_bfd, pgp))
   2738 	{
   2739 	  *error_message =
   2740 	    (char *) _("GP relative relocation when _gp not defined");
   2741 	  return bfd_reloc_dangerous;
   2742 	}
   2743     }
   2744 
   2745   return bfd_reloc_ok;
   2746 }
   2747 
   2748 /* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
   2749    become the offset from the gp register.  */
   2750 
   2751 static bfd_reloc_status_type
   2752 mips_elf_gprel16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
   2753 			asymbol *symbol, void *data ATTRIBUTE_UNUSED,
   2754 			asection *input_section, bfd *output_bfd,
   2755 			char **error_message ATTRIBUTE_UNUSED)
   2756 {
   2757   bfd_boolean relocatable;
   2758   bfd_reloc_status_type ret;
   2759   bfd_vma gp;
   2760 
   2761   if (output_bfd != NULL)
   2762     relocatable = TRUE;
   2763   else
   2764     {
   2765       relocatable = FALSE;
   2766       output_bfd = symbol->section->output_section->owner;
   2767     }
   2768 
   2769   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
   2770 			   &gp);
   2771   if (ret != bfd_reloc_ok)
   2772     return ret;
   2773 
   2774   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   2775 					input_section, relocatable,
   2776 					data, gp);
   2777 }
   2778 
   2779 /* Do a R_MIPS_LITERAL relocation.  */
   2780 
   2781 static bfd_reloc_status_type
   2782 mips_elf_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   2783 			void *data, asection *input_section, bfd *output_bfd,
   2784 			char **error_message)
   2785 {
   2786   bfd_boolean relocatable;
   2787   bfd_reloc_status_type ret;
   2788   bfd_vma gp;
   2789 
   2790   /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
   2791   if (output_bfd != NULL
   2792       && (symbol->flags & BSF_SECTION_SYM) == 0
   2793       && (symbol->flags & BSF_LOCAL) != 0)
   2794     {
   2795       *error_message = (char *)
   2796 	_("literal relocation occurs for an external symbol");
   2797       return bfd_reloc_outofrange;
   2798     }
   2799 
   2800   /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
   2801   if (output_bfd != NULL)
   2802     relocatable = TRUE;
   2803   else
   2804     {
   2805       relocatable = FALSE;
   2806       output_bfd = symbol->section->output_section->owner;
   2807     }
   2808 
   2809   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
   2810 			   &gp);
   2811   if (ret != bfd_reloc_ok)
   2812     return ret;
   2813 
   2814   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   2815 					input_section, relocatable,
   2816 					data, gp);
   2817 }
   2818 
   2819 /* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
   2820    become the offset from the gp register.  */
   2821 
   2822 static bfd_reloc_status_type
   2823 mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   2824 			void *data, asection *input_section, bfd *output_bfd,
   2825 			char **error_message)
   2826 {
   2827   bfd_boolean relocatable;
   2828   bfd_reloc_status_type ret;
   2829   bfd_vma gp;
   2830 
   2831   /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
   2832   if (output_bfd != NULL
   2833       && (symbol->flags & BSF_SECTION_SYM) == 0
   2834       && (symbol->flags & BSF_LOCAL) != 0)
   2835     {
   2836       *error_message = (char *)
   2837 	_("32bits gp relative relocation occurs for an external symbol");
   2838       return bfd_reloc_outofrange;
   2839     }
   2840 
   2841   if (output_bfd != NULL)
   2842     {
   2843       relocatable = TRUE;
   2844       gp = _bfd_get_gp_value (output_bfd);
   2845     }
   2846   else
   2847     {
   2848       relocatable = FALSE;
   2849       output_bfd = symbol->section->output_section->owner;
   2850 
   2851       ret = mips_elf_final_gp (output_bfd, symbol, relocatable,
   2852 			       error_message, &gp);
   2853       if (ret != bfd_reloc_ok)
   2854 	return ret;
   2855     }
   2856 
   2857   return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
   2858 			  relocatable, data, gp);
   2859 }
   2860 
   2861 static bfd_reloc_status_type
   2862 gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry,
   2863 		 asection *input_section, bfd_boolean relocatable,
   2864 		 void *data, bfd_vma gp)
   2865 {
   2866   bfd_vma relocation;
   2867   unsigned long val;
   2868 
   2869   if (bfd_is_com_section (symbol->section))
   2870     relocation = 0;
   2871   else
   2872     relocation = symbol->value;
   2873 
   2874   relocation += symbol->section->output_section->vma;
   2875   relocation += symbol->section->output_offset;
   2876 
   2877   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
   2878     return bfd_reloc_outofrange;
   2879 
   2880   if (reloc_entry->howto->src_mask == 0)
   2881     val = 0;
   2882   else
   2883     val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
   2884 
   2885   /* Set val to the offset into the section or symbol.  */
   2886   val += reloc_entry->addend;
   2887 
   2888   /* Adjust val for the final section location and GP value.  If we
   2889      are producing relocatable output, we don't want to do this for
   2890      an external symbol.  */
   2891   if (! relocatable
   2892       || (symbol->flags & BSF_SECTION_SYM) != 0)
   2893     val += relocation - gp;
   2894 
   2895   bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
   2896 
   2897   if (relocatable)
   2898     reloc_entry->address += input_section->output_offset;
   2899 
   2900   return bfd_reloc_ok;
   2901 }
   2902 
   2903 /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
   2904    the rest is at bits 6-10. The bitpos already got right by the howto.  */
   2905 
   2906 static bfd_reloc_status_type
   2907 mips_elf_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   2908 		       void *data, asection *input_section, bfd *output_bfd,
   2909 		       char **error_message)
   2910 {
   2911   if (reloc_entry->howto->partial_inplace)
   2912     {
   2913       reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
   2914 			     | (reloc_entry->addend & 0x00000800) >> 9);
   2915     }
   2916 
   2917   return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
   2918 				      input_section, output_bfd,
   2919 				      error_message);
   2920 }
   2921 
   2922 /* Handle a mips16 GP relative reloc.  */
   2924 
   2925 static bfd_reloc_status_type
   2926 mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   2927 		    void *data, asection *input_section, bfd *output_bfd,
   2928 		    char **error_message)
   2929 {
   2930   bfd_boolean relocatable;
   2931   bfd_reloc_status_type ret;
   2932   bfd_byte *location;
   2933   bfd_vma gp;
   2934 
   2935   /* If we're relocating, and this is an external symbol, we don't want
   2936      to change anything.  */
   2937   if (output_bfd != NULL
   2938       && (symbol->flags & BSF_SECTION_SYM) == 0
   2939       && (symbol->flags & BSF_LOCAL) != 0)
   2940     {
   2941       reloc_entry->address += input_section->output_offset;
   2942       return bfd_reloc_ok;
   2943     }
   2944 
   2945   if (output_bfd != NULL)
   2946     relocatable = TRUE;
   2947   else
   2948     {
   2949       relocatable = FALSE;
   2950       output_bfd = symbol->section->output_section->owner;
   2951     }
   2952 
   2953   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
   2954 			   &gp);
   2955   if (ret != bfd_reloc_ok)
   2956     return ret;
   2957 
   2958   location = (bfd_byte *) data + reloc_entry->address;
   2959   _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
   2960 				 location);
   2961   ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   2962 				       input_section, relocatable,
   2963 				       data, gp);
   2964   _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
   2965 			       location);
   2966 
   2967   return ret;
   2968 }
   2969 
   2970 /* A mapping from BFD reloc types to MIPS ELF reloc types.  */
   2972 
   2973 struct elf_reloc_map {
   2974   bfd_reloc_code_real_type bfd_val;
   2975   enum elf_mips_reloc_type elf_val;
   2976 };
   2977 
   2978 static const struct elf_reloc_map mips_reloc_map[] =
   2979 {
   2980   { BFD_RELOC_NONE, R_MIPS_NONE },
   2981   { BFD_RELOC_16, R_MIPS_16 },
   2982   { BFD_RELOC_32, R_MIPS_32 },
   2983   /* There is no BFD reloc for R_MIPS_REL32.  */
   2984   { BFD_RELOC_CTOR, R_MIPS_32 },
   2985   { BFD_RELOC_64, R_MIPS_64 },
   2986   { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
   2987   { BFD_RELOC_HI16_S, R_MIPS_HI16 },
   2988   { BFD_RELOC_LO16, R_MIPS_LO16 },
   2989   { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
   2990   { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
   2991   { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
   2992   { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
   2993   { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
   2994   { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
   2995   { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
   2996   { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
   2997   { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
   2998   { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
   2999   { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
   3000   { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
   3001   { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
   3002   { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
   3003   { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
   3004   { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
   3005   { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
   3006   { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
   3007   { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
   3008   { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
   3009   { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
   3010   { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
   3011   { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
   3012   /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
   3013   { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
   3014   { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
   3015   { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
   3016   { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
   3017   { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
   3018   { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
   3019   { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
   3020   { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
   3021   { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
   3022   { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
   3023   { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
   3024   { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
   3025   { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
   3026   { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
   3027   { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 }
   3028 };
   3029 
   3030 static const struct elf_reloc_map mips16_reloc_map[] =
   3031 {
   3032   { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
   3033   { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
   3034   { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
   3035   { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
   3036   { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
   3037   { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
   3038   { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
   3039   { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
   3040   { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
   3041     R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
   3042   { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
   3043     R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
   3044   { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
   3045   { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
   3046   { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
   3047 };
   3048 
   3049 static const struct elf_reloc_map micromips_reloc_map[] =
   3050 {
   3051   { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min },
   3052   { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min },
   3053   { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min },
   3054   { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min },
   3055   { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min },
   3056   { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min },
   3057   { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min },
   3058   { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min },
   3059   { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min },
   3060   { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min },
   3061   { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min },
   3062   { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min },
   3063   { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min },
   3064   { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min },
   3065   { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min },
   3066   { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min },
   3067   { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min },
   3068   { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min },
   3069   { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min },
   3070   { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
   3071   { BFD_RELOC_MICROMIPS_SCN_DISP, R_MICROMIPS_SCN_DISP - R_MICROMIPS_min },
   3072   { BFD_RELOC_MICROMIPS_JALR, R_MICROMIPS_JALR - R_MICROMIPS_min },
   3073 };
   3074 
   3075 /* Given a BFD reloc type, return a howto structure.  */
   3076 
   3077 static reloc_howto_type *
   3078 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   3079 				 bfd_reloc_code_real_type code)
   3080 {
   3081   unsigned int i;
   3082   /* FIXME: We default to RELA here instead of choosing the right
   3083      relocation variant.  */
   3084   reloc_howto_type *howto_table = elf_mips_howto_table_rela;
   3085   reloc_howto_type *howto16_table = elf_mips16_howto_table_rela;
   3086   reloc_howto_type *howto_micromips_table = elf_micromips_howto_table_rela;
   3087 
   3088   for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
   3089        i++)
   3090     {
   3091       if (mips_reloc_map[i].bfd_val == code)
   3092 	return &howto_table[(int) mips_reloc_map[i].elf_val];
   3093     }
   3094 
   3095   for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
   3096        i++)
   3097     {
   3098       if (mips16_reloc_map[i].bfd_val == code)
   3099 	return &howto16_table[(int) mips16_reloc_map[i].elf_val];
   3100     }
   3101 
   3102   for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map);
   3103        i++)
   3104     {
   3105       if (micromips_reloc_map[i].bfd_val == code)
   3106 	return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val];
   3107     }
   3108 
   3109   switch (code)
   3110     {
   3111     case BFD_RELOC_VTABLE_INHERIT:
   3112       return &elf_mips_gnu_vtinherit_howto;
   3113     case BFD_RELOC_VTABLE_ENTRY:
   3114       return &elf_mips_gnu_vtentry_howto;
   3115     case BFD_RELOC_32_PCREL:
   3116       return &elf_mips_gnu_pcrel32;
   3117     case BFD_RELOC_MIPS_EH:
   3118       return &elf_mips_eh_howto;
   3119     case BFD_RELOC_MIPS_COPY:
   3120       return &elf_mips_copy_howto;
   3121     case BFD_RELOC_MIPS_JUMP_SLOT:
   3122       return &elf_mips_jump_slot_howto;
   3123     default:
   3124       bfd_set_error (bfd_error_bad_value);
   3125       return NULL;
   3126     }
   3127 }
   3128 
   3129 static reloc_howto_type *
   3130 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   3131 				 const char *r_name)
   3132 {
   3133   unsigned int i;
   3134 
   3135   for (i = 0;
   3136        i < (sizeof (elf_mips_howto_table_rela)
   3137 	    / sizeof (elf_mips_howto_table_rela[0]));
   3138        i++)
   3139     if (elf_mips_howto_table_rela[i].name != NULL
   3140 	&& strcasecmp (elf_mips_howto_table_rela[i].name, r_name) == 0)
   3141       return &elf_mips_howto_table_rela[i];
   3142 
   3143   for (i = 0;
   3144        i < (sizeof (elf_mips16_howto_table_rela)
   3145 	    / sizeof (elf_mips16_howto_table_rela[0]));
   3146        i++)
   3147     if (elf_mips16_howto_table_rela[i].name != NULL
   3148 	&& strcasecmp (elf_mips16_howto_table_rela[i].name, r_name) == 0)
   3149       return &elf_mips16_howto_table_rela[i];
   3150 
   3151   for (i = 0;
   3152        i < (sizeof (elf_micromips_howto_table_rela)
   3153 	    / sizeof (elf_micromips_howto_table_rela[0]));
   3154        i++)
   3155     if (elf_micromips_howto_table_rela[i].name != NULL
   3156 	&& strcasecmp (elf_micromips_howto_table_rela[i].name, r_name) == 0)
   3157       return &elf_micromips_howto_table_rela[i];
   3158 
   3159   if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
   3160     return &elf_mips_gnu_vtinherit_howto;
   3161   if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
   3162     return &elf_mips_gnu_vtentry_howto;
   3163   if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
   3164     return &elf_mips_gnu_rel16_s2;
   3165   if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
   3166     return &elf_mips_gnu_rela16_s2;
   3167   if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0)
   3168     return &elf_mips_gnu_pcrel32;
   3169   if (strcasecmp (elf_mips_eh_howto.name, r_name) == 0)
   3170     return &elf_mips_eh_howto;
   3171   if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
   3172     return &elf_mips_copy_howto;
   3173   if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
   3174     return &elf_mips_jump_slot_howto;
   3175 
   3176   return NULL;
   3177 }
   3178 
   3179 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
   3180 
   3181 static reloc_howto_type *
   3182 mips_elf_n32_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
   3183 {
   3184   switch (r_type)
   3185     {
   3186     case R_MIPS_GNU_VTINHERIT:
   3187       return &elf_mips_gnu_vtinherit_howto;
   3188     case R_MIPS_GNU_VTENTRY:
   3189       return &elf_mips_gnu_vtentry_howto;
   3190     case R_MIPS_GNU_REL16_S2:
   3191       if (rela_p)
   3192 	return &elf_mips_gnu_rela16_s2;
   3193       else
   3194 	return &elf_mips_gnu_rel16_s2;
   3195     case R_MIPS_PC32:
   3196       return &elf_mips_gnu_pcrel32;
   3197     case R_MIPS_EH:
   3198       return &elf_mips_eh_howto;
   3199     case R_MIPS_COPY:
   3200       return &elf_mips_copy_howto;
   3201     case R_MIPS_JUMP_SLOT:
   3202       return &elf_mips_jump_slot_howto;
   3203     default:
   3204       if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
   3205 	{
   3206 	  if (rela_p)
   3207 	    return &elf_micromips_howto_table_rela[r_type - R_MICROMIPS_min];
   3208 	  else
   3209 	    return &elf_micromips_howto_table_rel[r_type - R_MICROMIPS_min];
   3210 	}
   3211       if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
   3212 	{
   3213 	  if (rela_p)
   3214 	    return &elf_mips16_howto_table_rela[r_type - R_MIPS16_min];
   3215 	  else
   3216 	    return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
   3217 	}
   3218       BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
   3219       if (rela_p)
   3220 	return &elf_mips_howto_table_rela[r_type];
   3221       else
   3222 	return &elf_mips_howto_table_rel[r_type];
   3223       break;
   3224     }
   3225 }
   3226 
   3227 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
   3228 
   3229 static void
   3230 mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
   3231 {
   3232   unsigned int r_type;
   3233 
   3234   r_type = ELF32_R_TYPE (dst->r_info);
   3235   cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, FALSE);
   3236 
   3237   /* The addend for a GPREL16 or LITERAL relocation comes from the GP
   3238      value for the object file.  We get the addend now, rather than
   3239      when we do the relocation, because the symbol manipulations done
   3240      by the linker may cause us to lose track of the input BFD.  */
   3241   if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
   3242       && (gprel16_reloc_p (r_type) || r_type == (unsigned int) R_MIPS_LITERAL))
   3243     cache_ptr->addend = elf_gp (abfd);
   3244 }
   3245 
   3246 /* Given a MIPS Elf_Internal_Rela, fill in an arelent structure.  */
   3247 
   3248 static void
   3249 mips_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
   3250 			 arelent *cache_ptr, Elf_Internal_Rela *dst)
   3251 {
   3252   unsigned int r_type;
   3253 
   3254   r_type = ELF32_R_TYPE (dst->r_info);
   3255   cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, TRUE);
   3256   cache_ptr->addend = dst->r_addend;
   3257 }
   3258 
   3259 /* Determine whether a symbol is global for the purposes of splitting
   3261    the symbol table into global symbols and local symbols.  At least
   3262    on Irix 5, this split must be between section symbols and all other
   3263    symbols.  On most ELF targets the split is between static symbols
   3264    and externally visible symbols.  */
   3265 
   3266 static bfd_boolean
   3267 mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
   3268 {
   3269   if (SGI_COMPAT (abfd))
   3270     return (sym->flags & BSF_SECTION_SYM) == 0;
   3271   else
   3272     return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
   3273 	    || bfd_is_und_section (bfd_get_section (sym))
   3274 	    || bfd_is_com_section (bfd_get_section (sym)));
   3275 }
   3276 
   3277 /* Set the right machine number for a MIPS ELF file.  */
   3279 
   3280 static bfd_boolean
   3281 mips_elf_n32_object_p (bfd *abfd)
   3282 {
   3283   unsigned long mach;
   3284 
   3285   if (!ABI_N32_P (abfd))
   3286     return FALSE;
   3287 
   3288   /* Irix 5 and 6 are broken.  Object file symbol tables are not always
   3289      sorted correctly such that local symbols precede global symbols,
   3290      and the sh_info field in the symbol table is not always right.  */
   3291   if (SGI_COMPAT (abfd))
   3292     elf_bad_symtab (abfd) = TRUE;
   3293 
   3294   mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
   3295   bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
   3296   return TRUE;
   3297 }
   3298 
   3299 /* Support for core dump NOTE sections.  */
   3301 static bfd_boolean
   3302 elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
   3303 {
   3304   int offset;
   3305   unsigned int size;
   3306 
   3307   switch (note->descsz)
   3308     {
   3309       default:
   3310 	return FALSE;
   3311 
   3312       case 440:		/* Linux/MIPS N32 */
   3313 	/* pr_cursig */
   3314 	elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
   3315 
   3316 	/* pr_pid */
   3317 	elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
   3318 
   3319 	/* pr_reg */
   3320 	offset = 72;
   3321 	size = 360;
   3322 
   3323 	break;
   3324     }
   3325 
   3326   /* Make a ".reg/999" section.  */
   3327   return _bfd_elfcore_make_pseudosection (abfd, ".reg", size,
   3328 					  note->descpos + offset);
   3329 }
   3330 
   3331 static bfd_boolean
   3332 elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
   3333 {
   3334   switch (note->descsz)
   3335     {
   3336       default:
   3337 	return FALSE;
   3338 
   3339       case 128:		/* Linux/MIPS elf_prpsinfo */
   3340 	elf_tdata (abfd)->core->program
   3341 	 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
   3342 	elf_tdata (abfd)->core->command
   3343 	 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
   3344     }
   3345 
   3346   /* Note that for some reason, a spurious space is tacked
   3347      onto the end of the args in some (at least one anyway)
   3348      implementations, so strip it off if it exists.  */
   3349 
   3350   {
   3351     char *command = elf_tdata (abfd)->core->command;
   3352     int n = strlen (command);
   3353 
   3354     if (0 < n && command[n - 1] == ' ')
   3355       command[n - 1] = '\0';
   3356   }
   3357 
   3358   return TRUE;
   3359 }
   3360 
   3361 /* Depending on the target vector we generate some version of Irix
   3363    executables or "normal" MIPS ELF ABI executables.  */
   3364 static irix_compat_t
   3365 elf_n32_mips_irix_compat (bfd *abfd)
   3366 {
   3367   if ((abfd->xvec == &bfd_elf32_nbigmips_vec)
   3368       || (abfd->xvec == &bfd_elf32_nlittlemips_vec))
   3369     return ict_irix6;
   3370   else
   3371     return ict_none;
   3372 }
   3373 
   3374 /* ECOFF swapping routines.  These are used when dealing with the
   3376    .mdebug section, which is in the ECOFF debugging format.  */
   3377 static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
   3378   /* Symbol table magic number.  */
   3379   magicSym,
   3380   /* Alignment of debugging information.  E.g., 4.  */
   3381   4,
   3382   /* Sizes of external symbolic information.  */
   3383   sizeof (struct hdr_ext),
   3384   sizeof (struct dnr_ext),
   3385   sizeof (struct pdr_ext),
   3386   sizeof (struct sym_ext),
   3387   sizeof (struct opt_ext),
   3388   sizeof (struct fdr_ext),
   3389   sizeof (struct rfd_ext),
   3390   sizeof (struct ext_ext),
   3391   /* Functions to swap in external symbolic data.  */
   3392   ecoff_swap_hdr_in,
   3393   ecoff_swap_dnr_in,
   3394   ecoff_swap_pdr_in,
   3395   ecoff_swap_sym_in,
   3396   ecoff_swap_opt_in,
   3397   ecoff_swap_fdr_in,
   3398   ecoff_swap_rfd_in,
   3399   ecoff_swap_ext_in,
   3400   _bfd_ecoff_swap_tir_in,
   3401   _bfd_ecoff_swap_rndx_in,
   3402   /* Functions to swap out external symbolic data.  */
   3403   ecoff_swap_hdr_out,
   3404   ecoff_swap_dnr_out,
   3405   ecoff_swap_pdr_out,
   3406   ecoff_swap_sym_out,
   3407   ecoff_swap_opt_out,
   3408   ecoff_swap_fdr_out,
   3409   ecoff_swap_rfd_out,
   3410   ecoff_swap_ext_out,
   3411   _bfd_ecoff_swap_tir_out,
   3412   _bfd_ecoff_swap_rndx_out,
   3413   /* Function to read in symbolic data.  */
   3414   _bfd_mips_elf_read_ecoff_info
   3415 };
   3416 
   3417 #define ELF_ARCH			bfd_arch_mips
   3419 #define ELF_TARGET_ID			MIPS_ELF_DATA
   3420 #define ELF_MACHINE_CODE		EM_MIPS
   3421 
   3422 #define elf_backend_collect		TRUE
   3423 #define elf_backend_type_change_ok	TRUE
   3424 #define elf_backend_can_gc_sections	TRUE
   3425 #define elf_info_to_howto		mips_info_to_howto_rela
   3426 #define elf_info_to_howto_rel		mips_info_to_howto_rel
   3427 #define elf_backend_sym_is_global	mips_elf_sym_is_global
   3428 #define elf_backend_object_p		mips_elf_n32_object_p
   3429 #define elf_backend_symbol_processing	_bfd_mips_elf_symbol_processing
   3430 #define elf_backend_section_processing	_bfd_mips_elf_section_processing
   3431 #define elf_backend_section_from_shdr	_bfd_mips_elf_section_from_shdr
   3432 #define elf_backend_fake_sections	_bfd_mips_elf_fake_sections
   3433 #define elf_backend_section_from_bfd_section \
   3434 					_bfd_mips_elf_section_from_bfd_section
   3435 #define elf_backend_add_symbol_hook	_bfd_mips_elf_add_symbol_hook
   3436 #define elf_backend_link_output_symbol_hook \
   3437 					_bfd_mips_elf_link_output_symbol_hook
   3438 #define elf_backend_create_dynamic_sections \
   3439 					_bfd_mips_elf_create_dynamic_sections
   3440 #define elf_backend_check_relocs	_bfd_mips_elf_check_relocs
   3441 #define elf_backend_merge_symbol_attribute \
   3442 					_bfd_mips_elf_merge_symbol_attribute
   3443 #define elf_backend_get_target_dtag	_bfd_mips_elf_get_target_dtag
   3444 #define elf_backend_adjust_dynamic_symbol \
   3445 					_bfd_mips_elf_adjust_dynamic_symbol
   3446 #define elf_backend_always_size_sections \
   3447 					_bfd_mips_elf_always_size_sections
   3448 #define elf_backend_size_dynamic_sections \
   3449 					_bfd_mips_elf_size_dynamic_sections
   3450 #define elf_backend_init_index_section	_bfd_elf_init_1_index_section
   3451 #define elf_backend_relocate_section	_bfd_mips_elf_relocate_section
   3452 #define elf_backend_finish_dynamic_symbol \
   3453 					_bfd_mips_elf_finish_dynamic_symbol
   3454 #define elf_backend_finish_dynamic_sections \
   3455 					_bfd_mips_elf_finish_dynamic_sections
   3456 #define elf_backend_final_write_processing \
   3457 					_bfd_mips_elf_final_write_processing
   3458 #define elf_backend_additional_program_headers \
   3459 					_bfd_mips_elf_additional_program_headers
   3460 #define elf_backend_modify_segment_map	_bfd_mips_elf_modify_segment_map
   3461 #define elf_backend_gc_mark_hook	_bfd_mips_elf_gc_mark_hook
   3462 #define elf_backend_gc_sweep_hook	_bfd_mips_elf_gc_sweep_hook
   3463 #define elf_backend_copy_indirect_symbol \
   3464 					_bfd_mips_elf_copy_indirect_symbol
   3465 #define elf_backend_grok_prstatus	elf32_mips_grok_prstatus
   3466 #define elf_backend_grok_psinfo		elf32_mips_grok_psinfo
   3467 #define elf_backend_ecoff_debug_swap	&mips_elf32_ecoff_debug_swap
   3468 
   3469 #define elf_backend_got_header_size	(4 * MIPS_RESERVED_GOTNO)
   3470 
   3471 /* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations
   3472    work better/work only in RELA, so we default to this.  */
   3473 #define elf_backend_may_use_rel_p	1
   3474 #define elf_backend_may_use_rela_p	1
   3475 #define elf_backend_default_use_rela_p	1
   3476 #define elf_backend_rela_plts_and_copies_p 0
   3477 #define elf_backend_sign_extend_vma	TRUE
   3478 #define elf_backend_plt_readonly	1
   3479 #define elf_backend_plt_sym_val		_bfd_mips_elf_plt_sym_val
   3480 
   3481 #define elf_backend_discard_info	_bfd_mips_elf_discard_info
   3482 #define elf_backend_ignore_discarded_relocs \
   3483 					_bfd_mips_elf_ignore_discarded_relocs
   3484 #define elf_backend_write_section	_bfd_mips_elf_write_section
   3485 #define elf_backend_mips_irix_compat	elf_n32_mips_irix_compat
   3486 #define elf_backend_mips_rtype_to_howto	mips_elf_n32_rtype_to_howto
   3487 #define bfd_elf32_bfd_is_target_special_symbol \
   3488 					_bfd_mips_elf_is_target_special_symbol
   3489 #define bfd_elf32_find_nearest_line	_bfd_mips_elf_find_nearest_line
   3490 #define bfd_elf32_find_inliner_info	_bfd_mips_elf_find_inliner_info
   3491 #define bfd_elf32_new_section_hook	_bfd_mips_elf_new_section_hook
   3492 #define bfd_elf32_set_section_contents	_bfd_mips_elf_set_section_contents
   3493 #define bfd_elf32_bfd_get_relocated_section_contents \
   3494 				_bfd_elf_mips_get_relocated_section_contents
   3495 #define bfd_elf32_bfd_link_hash_table_create \
   3496 					_bfd_mips_elf_link_hash_table_create
   3497 #define bfd_elf32_bfd_final_link	_bfd_mips_elf_final_link
   3498 #define bfd_elf32_bfd_merge_private_bfd_data \
   3499 					_bfd_mips_elf_merge_private_bfd_data
   3500 #define bfd_elf32_bfd_set_private_flags	_bfd_mips_elf_set_private_flags
   3501 #define bfd_elf32_bfd_print_private_bfd_data \
   3502 					_bfd_mips_elf_print_private_bfd_data
   3503 #define bfd_elf32_bfd_relax_section     _bfd_mips_relax_section
   3504 #define bfd_elf32_mkobject		_bfd_mips_elf_mkobject
   3505 
   3506 /* Support for SGI-ish mips targets using n32 ABI.  */
   3507 
   3508 #define TARGET_LITTLE_SYM               bfd_elf32_nlittlemips_vec
   3509 #define TARGET_LITTLE_NAME              "elf32-nlittlemips"
   3510 #define TARGET_BIG_SYM                  bfd_elf32_nbigmips_vec
   3511 #define TARGET_BIG_NAME                 "elf32-nbigmips"
   3512 
   3513 #define ELF_MAXPAGESIZE			0x10000
   3514 #define ELF_COMMONPAGESIZE		0x1000
   3515 
   3516 #include "elf32-target.h"
   3517 
   3518 /* Support for traditional mips targets using n32 ABI.  */
   3519 #undef TARGET_LITTLE_SYM
   3520 #undef TARGET_LITTLE_NAME
   3521 #undef TARGET_BIG_SYM
   3522 #undef TARGET_BIG_NAME
   3523 
   3524 #undef ELF_MAXPAGESIZE
   3525 #undef ELF_COMMONPAGESIZE
   3526 
   3527 #define TARGET_LITTLE_SYM               bfd_elf32_ntradlittlemips_vec
   3528 #define TARGET_LITTLE_NAME              "elf32-ntradlittlemips"
   3529 #define TARGET_BIG_SYM                  bfd_elf32_ntradbigmips_vec
   3530 #define TARGET_BIG_NAME                 "elf32-ntradbigmips"
   3531 
   3532 #define ELF_MAXPAGESIZE			0x10000
   3533 #define ELF_COMMONPAGESIZE		0x1000
   3534 #define elf32_bed			elf32_tradbed
   3535 
   3536 /* Include the target file again for this target.  */
   3537 #include "elf32-target.h"
   3538 
   3539 
   3540 /* FreeBSD support.  */
   3541 
   3542 #undef TARGET_LITTLE_SYM
   3543 #undef TARGET_LITTLE_NAME
   3544 #undef TARGET_BIG_SYM
   3545 #undef TARGET_BIG_NAME
   3546 
   3547 #define	TARGET_LITTLE_SYM		bfd_elf32_ntradlittlemips_freebsd_vec
   3548 #define	TARGET_LITTLE_NAME		"elf32-ntradlittlemips-freebsd"
   3549 #define	TARGET_BIG_SYM			bfd_elf32_ntradbigmips_freebsd_vec
   3550 #define	TARGET_BIG_NAME			"elf32-ntradbigmips-freebsd"
   3551 
   3552 #undef	ELF_OSABI
   3553 #define	ELF_OSABI			ELFOSABI_FREEBSD
   3554 
   3555 #undef	elf32_bed
   3556 #define elf32_bed				elf32_fbsd_tradbed
   3557 
   3558 #include "elf32-target.h"
   3559