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