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