Home | History | Annotate | Line # | Download | only in bfd
elfn32-mips.c revision 1.4.8.1
      1 /* MIPS-specific support for 32-bit ELF
      2    Copyright (C) 1993-2016 Free Software Foundation, Inc.
      3 
      4    Most of the information added by Ian Lance Taylor, Cygnus Support,
      5    <ian (at) cygnus.com>.
      6    N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
      7    <mark (at) codesourcery.com>
      8    Traditional MIPS targets support added by Koundinya.K, Dansk Data
      9    Elektronik & Operations Research Group. <kk (at) ddeorg.soft.net>
     10 
     11    This file is part of BFD, the Binary File Descriptor library.
     12 
     13    This program is free software; you can redistribute it and/or modify
     14    it under the terms of the GNU General Public License as published by
     15    the Free Software Foundation; either version 3 of the License, or
     16    (at your option) any later version.
     17 
     18    This program is distributed in the hope that it will be useful,
     19    but WITHOUT ANY WARRANTY; without even the implied warranty of
     20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     21    GNU General Public License for more details.
     22 
     23    You should have received a copy of the GNU General Public License
     24    along with this program; if not, write to the Free Software
     25    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     26    MA 02110-1301, USA.  */
     27 
     28 
     29 /* This file handles MIPS ELF targets.  SGI Irix 5 uses a slightly
     30    different MIPS ELF from other targets.  This matters when linking.
     31    This file supports both, switching at runtime.  */
     32 
     33 #include "sysdep.h"
     34 #include "bfd.h"
     35 #include "libbfd.h"
     36 #include "bfdlink.h"
     37 #include "genlink.h"
     38 #include "elf-bfd.h"
     39 #include "elfxx-mips.h"
     40 #include "elf/mips.h"
     41 
     42 /* Get the ECOFF swapping routines.  */
     43 #include "coff/sym.h"
     44 #include "coff/symconst.h"
     45 #include "coff/internal.h"
     46 #include "coff/ecoff.h"
     47 #include "coff/mips.h"
     48 #define ECOFF_SIGNED_32
     49 #include "ecoffswap.h"
     50 
     51 static bfd_boolean mips_elf_assign_gp
     52   (bfd *, bfd_vma *);
     53 static bfd_reloc_status_type mips_elf_final_gp
     54   (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
     55 static bfd_reloc_status_type mips_elf_gprel16_reloc
     56   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     57 static bfd_reloc_status_type mips_elf_literal_reloc
     58   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     59 static bfd_reloc_status_type mips_elf_gprel32_reloc
     60   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     61 static bfd_reloc_status_type gprel32_with_gp
     62   (bfd *, asymbol *, arelent *, asection *, bfd_boolean, void *, bfd_vma);
     63 static bfd_reloc_status_type mips_elf_shift6_reloc
     64   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     65 static bfd_reloc_status_type mips16_gprel_reloc
     66   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     67 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
     68   (bfd *, bfd_reloc_code_real_type);
     69 static reloc_howto_type *mips_elf_n32_rtype_to_howto
     70   (unsigned int, bfd_boolean);
     71 static void mips_info_to_howto_rel
     72   (bfd *, arelent *, Elf_Internal_Rela *);
     73 static void mips_info_to_howto_rela
     74   (bfd *, arelent *, Elf_Internal_Rela *);
     75 static bfd_boolean mips_elf_sym_is_global
     76   (bfd *, asymbol *);
     77 static bfd_boolean mips_elf_n32_object_p
     78   (bfd *);
     79 static bfd_boolean elf32_mips_grok_prstatus
     80   (bfd *, Elf_Internal_Note *);
     81 static bfd_boolean elf32_mips_grok_psinfo
     82   (bfd *, Elf_Internal_Note *);
     83 static 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   /* MIPS16 16-bit PC-relative branch offset.  */
   1854   HOWTO (R_MIPS16_PC16_S1,	/* type */
   1855 	 1,			/* rightshift */
   1856 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1857 	 16,			/* bitsize */
   1858 	 TRUE,			/* pc_relative */
   1859 	 0,			/* bitpos */
   1860 	 complain_overflow_signed, /* complain_on_overflow */
   1861 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1862 	 "R_MIPS16_PC16_S1",	/* name */
   1863 	 TRUE,			/* partial_inplace */
   1864 	 0x0000ffff,		/* src_mask */
   1865 	 0x0000ffff,		/* dst_mask */
   1866 	 TRUE),			/* pcrel_offset */
   1867 };
   1868 
   1869 static reloc_howto_type elf_mips16_howto_table_rela[] =
   1870 {
   1871   /* The reloc used for the mips16 jump instruction.  */
   1872   HOWTO (R_MIPS16_26,		/* type */
   1873 	 2,			/* rightshift */
   1874 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1875 	 26,			/* bitsize */
   1876 	 FALSE,			/* pc_relative */
   1877 	 0,			/* bitpos */
   1878 	 complain_overflow_dont, /* complain_on_overflow */
   1879 	 			/* This needs complex overflow
   1880 				   detection, because the upper four
   1881 				   bits must match the PC.  */
   1882 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1883 	 "R_MIPS16_26",		/* name */
   1884 	 FALSE,			/* partial_inplace */
   1885 	 0,			/* src_mask */
   1886 	 0x3ffffff,		/* dst_mask */
   1887 	 FALSE),		/* pcrel_offset */
   1888 
   1889   /* The reloc used for the mips16 gprel instruction.  */
   1890   HOWTO (R_MIPS16_GPREL,	/* 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_signed, /* complain_on_overflow */
   1897 	 mips16_gprel_reloc,	/* special_function */
   1898 	 "R_MIPS16_GPREL",	/* name */
   1899 	 FALSE,			/* partial_inplace */
   1900 	 0,			/* src_mask */
   1901 	 0x0000ffff,	        /* dst_mask */
   1902 	 FALSE),		/* pcrel_offset */
   1903 
   1904   /* A MIPS16 reference to the global offset table.  */
   1905   HOWTO (R_MIPS16_GOT16,	/* 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_got16_reloc, /* special_function */
   1913 	 "R_MIPS16_GOT16",	/* name */
   1914 	 FALSE,			/* partial_inplace */
   1915 	 0,			/* src_mask */
   1916 	 0x0000ffff,	        /* dst_mask */
   1917 	 FALSE),		/* pcrel_offset */
   1918 
   1919   /* A MIPS16 call through the global offset table.  */
   1920   HOWTO (R_MIPS16_CALL16,	/* type */
   1921 	 0,			/* 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_generic_reloc, /* special_function */
   1928 	 "R_MIPS16_CALL16",	/* name */
   1929 	 FALSE,			/* partial_inplace */
   1930 	 0,			/* src_mask */
   1931 	 0x0000ffff,	        /* dst_mask */
   1932 	 FALSE),		/* pcrel_offset */
   1933 
   1934   /* MIPS16 high 16 bits of symbol value.  */
   1935   HOWTO (R_MIPS16_HI16,		/* type */
   1936 	 16,			/* 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_hi16_reloc, /* special_function */
   1943 	 "R_MIPS16_HI16",	/* name */
   1944 	 FALSE,			/* partial_inplace */
   1945 	 0,			/* src_mask */
   1946 	 0x0000ffff,		/* dst_mask */
   1947 	 FALSE),		/* pcrel_offset */
   1948 
   1949   /* MIPS16 low 16 bits of symbol value.  */
   1950   HOWTO (R_MIPS16_LO16,		/* 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_dont, /* complain_on_overflow */
   1957 	 _bfd_mips_elf_lo16_reloc, /* special_function */
   1958 	 "R_MIPS16_LO16",	/* name */
   1959 	 FALSE,			/* partial_inplace */
   1960 	 0,			/* src_mask */
   1961 	 0x0000ffff,		/* dst_mask */
   1962 	 FALSE),		/* pcrel_offset */
   1963 
   1964   /* MIPS16 TLS general dynamic variable reference.  */
   1965   HOWTO (R_MIPS16_TLS_GD,	/* 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_GD",	/* name */
   1974 	 FALSE,			/* partial_inplace */
   1975 	 0,			/* src_mask */
   1976 	 0x0000ffff,		/* dst_mask */
   1977 	 FALSE),		/* pcrel_offset */
   1978 
   1979   /* MIPS16 TLS local dynamic variable reference.  */
   1980   HOWTO (R_MIPS16_TLS_LDM,	/* 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_LDM",	/* 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_HI16,	/* 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_HI16",	/* name */
   2004 	 FALSE,			/* partial_inplace */
   2005 	 0,			/* src_mask */
   2006 	 0x0000ffff,		/* dst_mask */
   2007 	 FALSE),		/* pcrel_offset */
   2008 
   2009   /* MIPS16 TLS local dynamic offset.  */
   2010   HOWTO (R_MIPS16_TLS_DTPREL_LO16,	/* 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_DTPREL_LO16",	/* 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_GOTTPREL,	/* 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_GOTTPREL",	/* 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_HI16,	/* 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_HI16", /* name */
   2049 	 FALSE,			/* partial_inplace */
   2050 	 0,			/* src_mask */
   2051 	 0x0000ffff,		/* dst_mask */
   2052 	 FALSE),		/* pcrel_offset */
   2053 
   2054   /* MIPS16 TLS thread pointer offset.  */
   2055   HOWTO (R_MIPS16_TLS_TPREL_LO16,	/* type */
   2056 	 0,			/* rightshift */
   2057 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2058 	 16,			/* bitsize */
   2059 	 FALSE,			/* pc_relative */
   2060 	 0,			/* bitpos */
   2061 	 complain_overflow_signed, /* complain_on_overflow */
   2062 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2063 	 "R_MIPS16_TLS_TPREL_LO16", /* name */
   2064 	 FALSE,			/* partial_inplace */
   2065 	 0,			/* src_mask */
   2066 	 0x0000ffff,		/* dst_mask */
   2067 	 FALSE),		/* pcrel_offset */
   2068 
   2069   /* MIPS16 16-bit PC-relative branch offset.  */
   2070   HOWTO (R_MIPS16_PC16_S1,	/* type */
   2071 	 1,			/* rightshift */
   2072 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2073 	 16,			/* bitsize */
   2074 	 TRUE,			/* pc_relative */
   2075 	 0,			/* bitpos */
   2076 	 complain_overflow_signed, /* complain_on_overflow */
   2077 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2078 	 "R_MIPS16_PC16_S1",	/* name */
   2079 	 FALSE,			/* partial_inplace */
   2080 	 0,			/* src_mask */
   2081 	 0x0000ffff,		/* dst_mask */
   2082 	 TRUE),			/* pcrel_offset */
   2083 };
   2084 
   2085 static reloc_howto_type elf_micromips_howto_table_rel[] =
   2086 {
   2087   EMPTY_HOWTO (130),
   2088   EMPTY_HOWTO (131),
   2089   EMPTY_HOWTO (132),
   2090 
   2091   /* 26 bit jump address.  */
   2092   HOWTO (R_MICROMIPS_26_S1,	/* type */
   2093 	 1,			/* rightshift */
   2094 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2095 	 26,			/* bitsize */
   2096 	 FALSE,			/* pc_relative */
   2097 	 0,			/* bitpos */
   2098 	 complain_overflow_dont, /* complain_on_overflow */
   2099 	 			/* This needs complex overflow
   2100 				   detection, because the upper four
   2101 				   bits must match the PC.  */
   2102 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2103 	 "R_MICROMIPS_26_S1",	/* name */
   2104 	 TRUE,			/* partial_inplace */
   2105 	 0x3ffffff,		/* src_mask */
   2106 	 0x3ffffff,		/* dst_mask */
   2107 	 FALSE),		/* pcrel_offset */
   2108 
   2109   /* High 16 bits of symbol value.  */
   2110   HOWTO (R_MICROMIPS_HI16,	/* type */
   2111 	 16,			/* rightshift */
   2112 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2113 	 16,			/* bitsize */
   2114 	 FALSE,			/* pc_relative */
   2115 	 0,			/* bitpos */
   2116 	 complain_overflow_dont, /* complain_on_overflow */
   2117 	 _bfd_mips_elf_hi16_reloc, /* special_function */
   2118 	 "R_MICROMIPS_HI16",	/* name */
   2119 	 TRUE,			/* partial_inplace */
   2120 	 0x0000ffff,		/* src_mask */
   2121 	 0x0000ffff,		/* dst_mask */
   2122 	 FALSE),		/* pcrel_offset */
   2123 
   2124   /* Low 16 bits of symbol value.  */
   2125   HOWTO (R_MICROMIPS_LO16,	/* 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_dont, /* complain_on_overflow */
   2132 	 _bfd_mips_elf_lo16_reloc, /* special_function */
   2133 	 "R_MICROMIPS_LO16",	/* name */
   2134 	 TRUE,			/* partial_inplace */
   2135 	 0x0000ffff,		/* src_mask */
   2136 	 0x0000ffff,		/* dst_mask */
   2137 	 FALSE),		/* pcrel_offset */
   2138 
   2139   /* GP relative reference.  */
   2140   HOWTO (R_MICROMIPS_GPREL16,	/* 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_elf32_gprel16_reloc, /* special_function */
   2148 	 "R_MICROMIPS_GPREL16",	/* name */
   2149 	 TRUE,			/* partial_inplace */
   2150 	 0x0000ffff,		/* src_mask */
   2151 	 0x0000ffff,		/* dst_mask */
   2152 	 FALSE),		/* pcrel_offset */
   2153 
   2154   /* Reference to literal section.  */
   2155   HOWTO (R_MICROMIPS_LITERAL,	/* type */
   2156 	 0,			/* rightshift */
   2157 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2158 	 16,			/* bitsize */
   2159 	 FALSE,			/* pc_relative */
   2160 	 0,			/* bitpos */
   2161 	 complain_overflow_signed, /* complain_on_overflow */
   2162 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
   2163 	 "R_MICROMIPS_LITERAL",	/* name */
   2164 	 TRUE,			/* partial_inplace */
   2165 	 0x0000ffff,		/* src_mask */
   2166 	 0x0000ffff,		/* dst_mask */
   2167 	 FALSE),		/* pcrel_offset */
   2168 
   2169   /* Reference to global offset table.  */
   2170   HOWTO (R_MICROMIPS_GOT16,	/* type */
   2171 	 0,			/* rightshift */
   2172 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2173 	 16,			/* bitsize */
   2174 	 FALSE,			/* pc_relative */
   2175 	 0,			/* bitpos */
   2176 	 complain_overflow_signed, /* complain_on_overflow */
   2177 	 _bfd_mips_elf_got16_reloc, /* special_function */
   2178 	 "R_MICROMIPS_GOT16",	/* name */
   2179 	 TRUE,			/* partial_inplace */
   2180 	 0x0000ffff,		/* src_mask */
   2181 	 0x0000ffff,		/* dst_mask */
   2182 	 FALSE),		/* pcrel_offset */
   2183 
   2184   /* This is for microMIPS branches.  */
   2185   HOWTO (R_MICROMIPS_PC7_S1,	/* type */
   2186 	 1,			/* rightshift */
   2187 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   2188 	 7,			/* bitsize */
   2189 	 TRUE,			/* pc_relative */
   2190 	 0,			/* bitpos */
   2191 	 complain_overflow_signed, /* complain_on_overflow */
   2192 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2193 	 "R_MICROMIPS_PC7_S1",	/* name */
   2194 	 TRUE,			/* partial_inplace */
   2195 	 0x0000007f,		/* src_mask */
   2196 	 0x0000007f,		/* dst_mask */
   2197 	 TRUE),			/* pcrel_offset */
   2198 
   2199   HOWTO (R_MICROMIPS_PC10_S1,	/* type */
   2200 	 1,			/* rightshift */
   2201 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   2202 	 10,			/* bitsize */
   2203 	 TRUE,			/* pc_relative */
   2204 	 0,			/* bitpos */
   2205 	 complain_overflow_signed, /* complain_on_overflow */
   2206 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2207 	 "R_MICROMIPS_PC10_S1",	/* name */
   2208 	 TRUE,			/* partial_inplace */
   2209 	 0x000003ff,		/* src_mask */
   2210 	 0x000003ff,		/* dst_mask */
   2211 	 TRUE),			/* pcrel_offset */
   2212 
   2213   HOWTO (R_MICROMIPS_PC16_S1,	/* type */
   2214 	 1,			/* rightshift */
   2215 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2216 	 16,			/* bitsize */
   2217 	 TRUE,			/* pc_relative */
   2218 	 0,			/* bitpos */
   2219 	 complain_overflow_signed, /* complain_on_overflow */
   2220 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2221 	 "R_MICROMIPS_PC16_S1",	/* name */
   2222 	 TRUE,			/* partial_inplace */
   2223 	 0x0000ffff,		/* src_mask */
   2224 	 0x0000ffff,		/* dst_mask */
   2225 	 TRUE),			/* pcrel_offset */
   2226 
   2227   /* 16 bit call through global offset table.  */
   2228   HOWTO (R_MICROMIPS_CALL16,	/* type */
   2229 	 0,			/* rightshift */
   2230 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2231 	 16,			/* bitsize */
   2232 	 FALSE,			/* pc_relative */
   2233 	 0,			/* bitpos */
   2234 	 complain_overflow_signed, /* complain_on_overflow */
   2235 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2236 	 "R_MICROMIPS_CALL16",	/* name */
   2237 	 TRUE,			/* partial_inplace */
   2238 	 0x0000ffff,		/* src_mask */
   2239 	 0x0000ffff,		/* dst_mask */
   2240 	 FALSE),		/* pcrel_offset */
   2241 
   2242   EMPTY_HOWTO (143),
   2243   EMPTY_HOWTO (144),
   2244 
   2245   /* Displacement in the global offset table.  */
   2246   HOWTO (R_MICROMIPS_GOT_DISP,	/* 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_DISP",/* name */
   2255 	 TRUE,			/* partial_inplace */
   2256 	 0x0000ffff,		/* src_mask */
   2257 	 0x0000ffff,		/* dst_mask */
   2258 	 FALSE),		/* pcrel_offset */
   2259 
   2260   /* Displacement to page pointer in the global offset table.  */
   2261   HOWTO (R_MICROMIPS_GOT_PAGE,	/* 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_signed, /* complain_on_overflow */
   2268 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2269 	 "R_MICROMIPS_GOT_PAGE",/* name */
   2270 	 TRUE,			/* partial_inplace */
   2271 	 0x0000ffff,		/* src_mask */
   2272 	 0x0000ffff,		/* dst_mask */
   2273 	 FALSE),		/* pcrel_offset */
   2274 
   2275   /* Offset from page pointer in the global offset table.  */
   2276   HOWTO (R_MICROMIPS_GOT_OFST,	/* 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_signed, /* complain_on_overflow */
   2283 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2284 	 "R_MICROMIPS_GOT_OFST",/* name */
   2285 	 TRUE,			/* partial_inplace */
   2286 	 0x0000ffff,		/* src_mask */
   2287 	 0x0000ffff,		/* dst_mask */
   2288 	 FALSE),		/* pcrel_offset */
   2289 
   2290   /* High 16 bits of displacement in global offset table.  */
   2291   HOWTO (R_MICROMIPS_GOT_HI16,	/* type */
   2292 	 0,			/* rightshift */
   2293 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2294 	 16,			/* 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_GOT_HI16",/* name */
   2300 	 TRUE,			/* partial_inplace */
   2301 	 0x0000ffff,		/* src_mask */
   2302 	 0x0000ffff,		/* dst_mask */
   2303 	 FALSE),		/* pcrel_offset */
   2304 
   2305   /* Low 16 bits of displacement in global offset table.  */
   2306   HOWTO (R_MICROMIPS_GOT_LO16,	/* type */
   2307 	 0,			/* rightshift */
   2308 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2309 	 16,			/* bitsize */
   2310 	 FALSE,			/* pc_relative */
   2311 	 0,			/* bitpos */
   2312 	 complain_overflow_dont, /* complain_on_overflow */
   2313 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2314 	 "R_MICROMIPS_GOT_LO16",/* name */
   2315 	 TRUE,			/* partial_inplace */
   2316 	 0x0000ffff,		/* src_mask */
   2317 	 0x0000ffff,		/* dst_mask */
   2318 	 FALSE),		/* pcrel_offset */
   2319 
   2320   /* 64 bit subtraction.  Used in the N32 ABI.  */
   2321   HOWTO (R_MICROMIPS_SUB,	/* type */
   2322 	 0,			/* rightshift */
   2323 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   2324 	 64,			/* bitsize */
   2325 	 FALSE,			/* pc_relative */
   2326 	 0,			/* bitpos */
   2327 	 complain_overflow_dont, /* complain_on_overflow */
   2328 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2329 	 "R_MICROMIPS_SUB",	/* name */
   2330 	 TRUE,			/* partial_inplace */
   2331 	 MINUS_ONE,		/* src_mask */
   2332 	 MINUS_ONE,		/* dst_mask */
   2333 	 FALSE),		/* pcrel_offset */
   2334 
   2335   /* We don't support these for REL relocations, because it means building
   2336      the addend from a R_MICROMIPS_HIGHEST/R_MICROMIPS_HIGHER/
   2337      R_MICROMIPS_HI16/R_MICROMIPS_LO16 sequence with varying ordering,
   2338      using fallable heuristics.  */
   2339   EMPTY_HOWTO (R_MICROMIPS_HIGHER),
   2340   EMPTY_HOWTO (R_MICROMIPS_HIGHEST),
   2341 
   2342   /* High 16 bits of displacement in global offset table.  */
   2343   HOWTO (R_MICROMIPS_CALL_HI16,	/* type */
   2344 	 0,			/* rightshift */
   2345 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2346 	 16,			/* 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_CALL_HI16",/* name */
   2352 	 TRUE,			/* partial_inplace */
   2353 	 0x0000ffff,		/* src_mask */
   2354 	 0x0000ffff,		/* dst_mask */
   2355 	 FALSE),		/* pcrel_offset */
   2356 
   2357   /* Low 16 bits of displacement in global offset table.  */
   2358   HOWTO (R_MICROMIPS_CALL_LO16,	/* type */
   2359 	 0,			/* rightshift */
   2360 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2361 	 16,			/* bitsize */
   2362 	 FALSE,			/* pc_relative */
   2363 	 0,			/* bitpos */
   2364 	 complain_overflow_dont, /* complain_on_overflow */
   2365 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2366 	 "R_MICROMIPS_CALL_LO16",/* name */
   2367 	 TRUE,			/* partial_inplace */
   2368 	 0x0000ffff,		/* src_mask */
   2369 	 0x0000ffff,		/* dst_mask */
   2370 	 FALSE),		/* pcrel_offset */
   2371 
   2372   /* Section displacement.  */
   2373   HOWTO (R_MICROMIPS_SCN_DISP,  /* type */
   2374 	 0,			/* rightshift */
   2375 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2376 	 32,			/* bitsize */
   2377 	 FALSE,			/* pc_relative */
   2378 	 0,			/* bitpos */
   2379 	 complain_overflow_dont, /* complain_on_overflow */
   2380 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2381 	 "R_MICROMIPS_SCN_DISP", /* name */
   2382 	 TRUE,			/* partial_inplace */
   2383 	 0xffffffff,		/* src_mask */
   2384 	 0xffffffff,		/* dst_mask */
   2385 	 FALSE),		/* pcrel_offset */
   2386 
   2387   /* Protected jump conversion.  This is an optimization hint.  No
   2388      relocation is required for correctness.  */
   2389   HOWTO (R_MICROMIPS_JALR,	/* type */
   2390 	 0,			/* rightshift */
   2391 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2392 	 32,			/* bitsize */
   2393 	 FALSE,			/* pc_relative */
   2394 	 0,			/* bitpos */
   2395 	 complain_overflow_dont, /* complain_on_overflow */
   2396 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2397 	 "R_MICROMIPS_JALR",	/* name */
   2398 	 FALSE,			/* partial_inplace */
   2399 	 0,			/* src_mask */
   2400 	 0x00000000,		/* dst_mask */
   2401 	 FALSE),		/* pcrel_offset */
   2402 };
   2403 
   2404 static reloc_howto_type elf_micromips_howto_table_rela[] =
   2405 {
   2406   EMPTY_HOWTO (130),
   2407   EMPTY_HOWTO (131),
   2408   EMPTY_HOWTO (132),
   2409 
   2410   /* 26 bit jump address.  */
   2411   HOWTO (R_MICROMIPS_26_S1,	/* type */
   2412 	 1,			/* rightshift */
   2413 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2414 	 26,			/* bitsize */
   2415 	 FALSE,			/* pc_relative */
   2416 	 0,			/* bitpos */
   2417 	 complain_overflow_dont, /* complain_on_overflow */
   2418 	 			/* This needs complex overflow
   2419 				   detection, because the upper four
   2420 				   bits must match the PC.  */
   2421 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2422 	 "R_MICROMIPS_26_S1",	/* name */
   2423 	 FALSE,			/* partial_inplace */
   2424 	 0,			/* src_mask */
   2425 	 0x3ffffff,		/* dst_mask */
   2426 	 FALSE),		/* pcrel_offset */
   2427 
   2428   /* High 16 bits of symbol value.  */
   2429   HOWTO (R_MICROMIPS_HI16,	/* type */
   2430 	 16,			/* rightshift */
   2431 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2432 	 16,			/* bitsize */
   2433 	 FALSE,			/* pc_relative */
   2434 	 0,			/* bitpos */
   2435 	 complain_overflow_dont, /* complain_on_overflow */
   2436 	 _bfd_mips_elf_hi16_reloc, /* special_function */
   2437 	 "R_MICROMIPS_HI16",	/* name */
   2438 	 FALSE,			/* partial_inplace */
   2439 	 0,			/* src_mask */
   2440 	 0x0000ffff,		/* dst_mask */
   2441 	 FALSE),		/* pcrel_offset */
   2442 
   2443   /* Low 16 bits of symbol value.  */
   2444   HOWTO (R_MICROMIPS_LO16,	/* 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_dont, /* complain_on_overflow */
   2451 	 _bfd_mips_elf_lo16_reloc, /* special_function */
   2452 	 "R_MICROMIPS_LO16",	/* name */
   2453 	 FALSE,			/* partial_inplace */
   2454 	 0,			/* src_mask */
   2455 	 0x0000ffff,		/* dst_mask */
   2456 	 FALSE),		/* pcrel_offset */
   2457 
   2458   /* GP relative reference.  */
   2459   HOWTO (R_MICROMIPS_GPREL16,	/* 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_elf32_gprel16_reloc, /* special_function */
   2467 	 "R_MICROMIPS_GPREL16",	/* name */
   2468 	 FALSE,			/* partial_inplace */
   2469 	 0,			/* src_mask */
   2470 	 0x0000ffff,		/* dst_mask */
   2471 	 FALSE),		/* pcrel_offset */
   2472 
   2473   /* Reference to literal section.  */
   2474   HOWTO (R_MICROMIPS_LITERAL,	/* type */
   2475 	 0,			/* rightshift */
   2476 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2477 	 16,			/* bitsize */
   2478 	 FALSE,			/* pc_relative */
   2479 	 0,			/* bitpos */
   2480 	 complain_overflow_signed, /* complain_on_overflow */
   2481 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
   2482 	 "R_MICROMIPS_LITERAL",	/* name */
   2483 	 FALSE,			/* partial_inplace */
   2484 	 0,			/* src_mask */
   2485 	 0x0000ffff,		/* dst_mask */
   2486 	 FALSE),		/* pcrel_offset */
   2487 
   2488   /* Reference to global offset table.  */
   2489   HOWTO (R_MICROMIPS_GOT16,	/* type */
   2490 	 0,			/* rightshift */
   2491 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2492 	 16,			/* bitsize */
   2493 	 FALSE,			/* pc_relative */
   2494 	 0,			/* bitpos */
   2495 	 complain_overflow_signed, /* complain_on_overflow */
   2496 	 _bfd_mips_elf_got16_reloc, /* special_function */
   2497 	 "R_MICROMIPS_GOT16",	/* name */
   2498 	 FALSE,			/* partial_inplace */
   2499 	 0,			/* src_mask */
   2500 	 0x0000ffff,		/* dst_mask */
   2501 	 FALSE),		/* pcrel_offset */
   2502 
   2503   /* This is for microMIPS branches.  */
   2504   HOWTO (R_MICROMIPS_PC7_S1,	/* type */
   2505 	 1,			/* rightshift */
   2506 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   2507 	 7,			/* bitsize */
   2508 	 TRUE,			/* pc_relative */
   2509 	 0,			/* bitpos */
   2510 	 complain_overflow_signed, /* complain_on_overflow */
   2511 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2512 	 "R_MICROMIPS_PC7_S1",	/* name */
   2513 	 FALSE,			/* partial_inplace */
   2514 	 0,			/* src_mask */
   2515 	 0x0000007f,		/* dst_mask */
   2516 	 TRUE),			/* pcrel_offset */
   2517 
   2518   HOWTO (R_MICROMIPS_PC10_S1,	/* type */
   2519 	 1,			/* rightshift */
   2520 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   2521 	 10,			/* bitsize */
   2522 	 TRUE,			/* pc_relative */
   2523 	 0,			/* bitpos */
   2524 	 complain_overflow_signed, /* complain_on_overflow */
   2525 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2526 	 "R_MICROMIPS_PC10_S1",	/* name */
   2527 	 FALSE,			/* partial_inplace */
   2528 	 0,			/* src_mask */
   2529 	 0x000003ff,		/* dst_mask */
   2530 	 TRUE),			/* pcrel_offset */
   2531 
   2532   HOWTO (R_MICROMIPS_PC16_S1,	/* type */
   2533 	 1,			/* rightshift */
   2534 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2535 	 16,			/* bitsize */
   2536 	 TRUE,			/* pc_relative */
   2537 	 0,			/* bitpos */
   2538 	 complain_overflow_signed, /* complain_on_overflow */
   2539 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2540 	 "R_MICROMIPS_PC16_S1",	/* name */
   2541 	 FALSE,			/* partial_inplace */
   2542 	 0,			/* src_mask */
   2543 	 0x0000ffff,		/* dst_mask */
   2544 	 TRUE),			/* pcrel_offset */
   2545 
   2546   /* 16 bit call through global offset table.  */
   2547   HOWTO (R_MICROMIPS_CALL16,	/* type */
   2548 	 0,			/* rightshift */
   2549 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2550 	 16,			/* bitsize */
   2551 	 FALSE,			/* pc_relative */
   2552 	 0,			/* bitpos */
   2553 	 complain_overflow_signed, /* complain_on_overflow */
   2554 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2555 	 "R_MICROMIPS_CALL16",	/* name */
   2556 	 FALSE,			/* partial_inplace */
   2557 	 0,			/* src_mask */
   2558 	 0x0000ffff,		/* dst_mask */
   2559 	 FALSE),		/* pcrel_offset */
   2560 
   2561   EMPTY_HOWTO (143),
   2562   EMPTY_HOWTO (144),
   2563 
   2564   /* Displacement in the global offset table.  */
   2565   HOWTO (R_MICROMIPS_GOT_DISP,	/* 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_DISP",/* name */
   2574 	 FALSE,			/* partial_inplace */
   2575 	 0,			/* src_mask */
   2576 	 0x0000ffff,		/* dst_mask */
   2577 	 FALSE),		/* pcrel_offset */
   2578 
   2579   /* Displacement to page pointer in the global offset table.  */
   2580   HOWTO (R_MICROMIPS_GOT_PAGE,	/* 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_signed, /* complain_on_overflow */
   2587 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2588 	 "R_MICROMIPS_GOT_PAGE",/* name */
   2589 	 FALSE,			/* partial_inplace */
   2590 	 0,			/* src_mask */
   2591 	 0x0000ffff,		/* dst_mask */
   2592 	 FALSE),		/* pcrel_offset */
   2593 
   2594   /* Offset from page pointer in the global offset table.  */
   2595   HOWTO (R_MICROMIPS_GOT_OFST,	/* 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_signed, /* complain_on_overflow */
   2602 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2603 	 "R_MICROMIPS_GOT_OFST",/* name */
   2604 	 FALSE,			/* partial_inplace */
   2605 	 0,			/* src_mask */
   2606 	 0x0000ffff,		/* dst_mask */
   2607 	 FALSE),		/* pcrel_offset */
   2608 
   2609   /* High 16 bits of displacement in global offset table.  */
   2610   HOWTO (R_MICROMIPS_GOT_HI16,	/* type */
   2611 	 0,			/* rightshift */
   2612 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2613 	 16,			/* 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_GOT_HI16",/* name */
   2619 	 FALSE,			/* partial_inplace */
   2620 	 0,			/* src_mask */
   2621 	 0x0000ffff,		/* dst_mask */
   2622 	 FALSE),		/* pcrel_offset */
   2623 
   2624   /* Low 16 bits of displacement in global offset table.  */
   2625   HOWTO (R_MICROMIPS_GOT_LO16,	/* 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_GOT_LO16",/* name */
   2634 	 FALSE,			/* partial_inplace */
   2635 	 0,			/* src_mask */
   2636 	 0x0000ffff,		/* dst_mask */
   2637 	 FALSE),		/* pcrel_offset */
   2638 
   2639   /* 64 bit subtraction.  Used in the N32 ABI.  */
   2640   HOWTO (R_MICROMIPS_SUB,	/* type */
   2641 	 0,			/* rightshift */
   2642 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   2643 	 64,			/* 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_SUB",	/* name */
   2649 	 FALSE,			/* partial_inplace */
   2650 	 0,			/* src_mask */
   2651 	 MINUS_ONE,		/* dst_mask */
   2652 	 FALSE),		/* pcrel_offset */
   2653 
   2654   /* Get the higher value of a 64 bit addend.  */
   2655   HOWTO (R_MICROMIPS_HIGHER,	/* 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_HIGHER",	/* name */
   2664 	 FALSE,			/* partial_inplace */
   2665 	 0,			/* src_mask */
   2666 	 0x0000ffff,		/* dst_mask */
   2667 	 FALSE),		/* pcrel_offset */
   2668 
   2669   /* Get the highest value of a 64 bit addend.  */
   2670   HOWTO (R_MICROMIPS_HIGHEST,	/* 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_HIGHEST",	/* name */
   2679 	 FALSE,			/* partial_inplace */
   2680 	 0,			/* src_mask */
   2681 	 0x0000ffff,		/* dst_mask */
   2682 	 FALSE),		/* pcrel_offset */
   2683 
   2684   /* High 16 bits of displacement in global offset table.  */
   2685   HOWTO (R_MICROMIPS_CALL_HI16,	/* type */
   2686 	 0,			/* rightshift */
   2687 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2688 	 16,			/* 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_CALL_HI16",/* name */
   2694 	 FALSE,			/* partial_inplace */
   2695 	 0,			/* src_mask */
   2696 	 0x0000ffff,		/* dst_mask */
   2697 	 FALSE),		/* pcrel_offset */
   2698 
   2699   /* Low 16 bits of displacement in global offset table.  */
   2700   HOWTO (R_MICROMIPS_CALL_LO16,	/* type */
   2701 	 0,			/* rightshift */
   2702 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2703 	 16,			/* bitsize */
   2704 	 FALSE,			/* pc_relative */
   2705 	 0,			/* bitpos */
   2706 	 complain_overflow_dont, /* complain_on_overflow */
   2707 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2708 	 "R_MICROMIPS_CALL_LO16",/* name */
   2709 	 FALSE,			/* partial_inplace */
   2710 	 0,			/* src_mask */
   2711 	 0x0000ffff,		/* dst_mask */
   2712 	 FALSE),		/* pcrel_offset */
   2713 
   2714   /* Section displacement.  */
   2715   HOWTO (R_MICROMIPS_SCN_DISP,  /* type */
   2716 	 0,			/* rightshift */
   2717 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2718 	 32,			/* bitsize */
   2719 	 FALSE,			/* pc_relative */
   2720 	 0,			/* bitpos */
   2721 	 complain_overflow_dont, /* complain_on_overflow */
   2722 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2723 	 "R_MICROMIPS_SCN_DISP", /* name */
   2724 	 FALSE,			/* partial_inplace */
   2725 	 0,			/* src_mask */
   2726 	 0xffffffff,		/* dst_mask */
   2727 	 FALSE),		/* pcrel_offset */
   2728 
   2729   /* Protected jump conversion.  This is an optimization hint.  No
   2730      relocation is required for correctness.  */
   2731   HOWTO (R_MICROMIPS_JALR,	/* type */
   2732 	 0,			/* rightshift */
   2733 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2734 	 32,			/* bitsize */
   2735 	 FALSE,			/* pc_relative */
   2736 	 0,			/* bitpos */
   2737 	 complain_overflow_dont, /* complain_on_overflow */
   2738 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2739 	 "R_MICROMIPS_JALR",	/* name */
   2740 	 FALSE,			/* partial_inplace */
   2741 	 0,			/* src_mask */
   2742 	 0x00000000,		/* dst_mask */
   2743 	 FALSE),		/* pcrel_offset */
   2744 };
   2745 
   2746 /* GNU extension to record C++ vtable hierarchy */
   2747 static reloc_howto_type elf_mips_gnu_vtinherit_howto =
   2748   HOWTO (R_MIPS_GNU_VTINHERIT,	/* type */
   2749 	 0,			/* rightshift */
   2750 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2751 	 0,			/* bitsize */
   2752 	 FALSE,			/* pc_relative */
   2753 	 0,			/* bitpos */
   2754 	 complain_overflow_dont, /* complain_on_overflow */
   2755 	 NULL,			/* special_function */
   2756 	 "R_MIPS_GNU_VTINHERIT", /* name */
   2757 	 FALSE,			/* partial_inplace */
   2758 	 0,			/* src_mask */
   2759 	 0,			/* dst_mask */
   2760 	 FALSE);		/* pcrel_offset */
   2761 
   2762 /* GNU extension to record C++ vtable member usage */
   2763 static reloc_howto_type elf_mips_gnu_vtentry_howto =
   2764   HOWTO (R_MIPS_GNU_VTENTRY,	/* type */
   2765 	 0,			/* rightshift */
   2766 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2767 	 0,			/* bitsize */
   2768 	 FALSE,			/* pc_relative */
   2769 	 0,			/* bitpos */
   2770 	 complain_overflow_dont, /* complain_on_overflow */
   2771 	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
   2772 	 "R_MIPS_GNU_VTENTRY",	/* name */
   2773 	 FALSE,			/* partial_inplace */
   2774 	 0,			/* src_mask */
   2775 	 0,			/* dst_mask */
   2776 	 FALSE);		/* pcrel_offset */
   2777 
   2778 /* 16 bit offset for pc-relative branches.  */
   2780 static reloc_howto_type elf_mips_gnu_rel16_s2 =
   2781   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
   2782 	 2,			/* rightshift */
   2783 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2784 	 16,			/* bitsize */
   2785 	 TRUE,			/* pc_relative */
   2786 	 0,			/* bitpos */
   2787 	 complain_overflow_signed, /* complain_on_overflow */
   2788 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2789 	 "R_MIPS_GNU_REL16_S2",	/* name */
   2790 	 TRUE,			/* partial_inplace */
   2791 	 0x0000ffff,		/* src_mask */
   2792 	 0x0000ffff,		/* dst_mask */
   2793 	 TRUE);			/* pcrel_offset */
   2794 
   2795 /* 16 bit offset for pc-relative branches.  */
   2796 static reloc_howto_type elf_mips_gnu_rela16_s2 =
   2797   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
   2798 	 2,			/* rightshift */
   2799 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2800 	 16,			/* bitsize */
   2801 	 TRUE,			/* pc_relative */
   2802 	 0,			/* bitpos */
   2803 	 complain_overflow_signed, /* complain_on_overflow */
   2804 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2805 	 "R_MIPS_GNU_REL16_S2",	/* name */
   2806 	 FALSE,			/* partial_inplace */
   2807 	 0,			/* src_mask */
   2808 	 0x0000ffff,		/* dst_mask */
   2809 	 TRUE);			/* pcrel_offset */
   2810 
   2811 /* 32 bit pc-relative.  Used for compact EH tables.  */
   2812 static reloc_howto_type elf_mips_gnu_pcrel32 =
   2813   HOWTO (R_MIPS_PC32,		/* type */
   2814 	 0,			/* rightshift */
   2815 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2816 	 32,			/* bitsize */
   2817 	 TRUE,			/* pc_relative */
   2818 	 0,			/* bitpos */
   2819 	 complain_overflow_signed, /* complain_on_overflow */
   2820 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2821 	 "R_MIPS_PC32",		/* name */
   2822 	 TRUE,			/* partial_inplace */
   2823 	 0xffffffff,		/* src_mask */
   2824 	 0xffffffff,		/* dst_mask */
   2825 	 TRUE);			/* pcrel_offset */
   2826 
   2827 
   2828 /* Originally a VxWorks extension, but now used for other systems too.  */
   2830 static reloc_howto_type elf_mips_copy_howto =
   2831   HOWTO (R_MIPS_COPY,		/* type */
   2832 	 0,			/* rightshift */
   2833 	 0,			/* this one is variable size */
   2834 	 0,			/* bitsize */
   2835 	 FALSE,			/* pc_relative */
   2836 	 0,			/* bitpos */
   2837 	 complain_overflow_bitfield, /* complain_on_overflow */
   2838 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2839 	 "R_MIPS_COPY",		/* name */
   2840 	 FALSE,			/* partial_inplace */
   2841 	 0x0,         		/* src_mask */
   2842 	 0x0,		        /* dst_mask */
   2843 	 FALSE);		/* pcrel_offset */
   2844 
   2845 /* Originally a VxWorks extension, but now used for other systems too.  */
   2846 static reloc_howto_type elf_mips_jump_slot_howto =
   2847   HOWTO (R_MIPS_JUMP_SLOT,	/* type */
   2848 	 0,			/* rightshift */
   2849 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2850 	 32,			/* bitsize */
   2851 	 FALSE,			/* pc_relative */
   2852 	 0,			/* bitpos */
   2853 	 complain_overflow_bitfield, /* complain_on_overflow */
   2854 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2855 	 "R_MIPS_JUMP_SLOT",	/* name */
   2856 	 FALSE,			/* partial_inplace */
   2857 	 0x0,         		/* src_mask */
   2858 	 0x0,		        /* dst_mask */
   2859 	 FALSE);		/* pcrel_offset */
   2860 
   2861 /* Used in EH tables.  */
   2862 static reloc_howto_type elf_mips_eh_howto =
   2863   HOWTO (R_MIPS_EH,		/* type */
   2864 	 0,			/* rightshift */
   2865 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2866 	 32,			/* bitsize */
   2867 	 FALSE,			/* pc_relative */
   2868 	 0,			/* bitpos */
   2869 	 complain_overflow_signed, /* complain_on_overflow */
   2870 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2871 	 "R_MIPS_EH",		/* name */
   2872 	 TRUE,			/* partial_inplace */
   2873 	 0xffffffff,		/* src_mask */
   2874 	 0xffffffff,	        /* dst_mask */
   2875 	 FALSE);		/* pcrel_offset */
   2876 
   2877 
   2878 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
   2880    dangerous relocation.  */
   2881 
   2882 static bfd_boolean
   2883 mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
   2884 {
   2885   unsigned int count;
   2886   asymbol **sym;
   2887   unsigned int i;
   2888 
   2889   /* If we've already figured out what GP will be, just return it.  */
   2890   *pgp = _bfd_get_gp_value (output_bfd);
   2891   if (*pgp)
   2892     return TRUE;
   2893 
   2894   count = bfd_get_symcount (output_bfd);
   2895   sym = bfd_get_outsymbols (output_bfd);
   2896 
   2897   /* The linker script will have created a symbol named `_gp' with the
   2898      appropriate value.  */
   2899   if (sym == NULL)
   2900     i = count;
   2901   else
   2902     {
   2903       for (i = 0; i < count; i++, sym++)
   2904 	{
   2905 	  register const char *name;
   2906 
   2907 	  name = bfd_asymbol_name (*sym);
   2908 	  if (*name == '_' && strcmp (name, "_gp") == 0)
   2909 	    {
   2910 	      *pgp = bfd_asymbol_value (*sym);
   2911 	      _bfd_set_gp_value (output_bfd, *pgp);
   2912 	      break;
   2913 	    }
   2914 	}
   2915     }
   2916 
   2917   if (i >= count)
   2918     {
   2919       /* Only get the error once.  */
   2920       *pgp = 4;
   2921       _bfd_set_gp_value (output_bfd, *pgp);
   2922       return FALSE;
   2923     }
   2924 
   2925   return TRUE;
   2926 }
   2927 
   2928 /* We have to figure out the gp value, so that we can adjust the
   2929    symbol value correctly.  We look up the symbol _gp in the output
   2930    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
   2931    target data.  We don't need to adjust the symbol value for an
   2932    external symbol if we are producing relocatable output.  */
   2933 
   2934 static bfd_reloc_status_type
   2935 mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
   2936 		   char **error_message, bfd_vma *pgp)
   2937 {
   2938   if (bfd_is_und_section (symbol->section)
   2939       && ! relocatable)
   2940     {
   2941       *pgp = 0;
   2942       return bfd_reloc_undefined;
   2943     }
   2944 
   2945   *pgp = _bfd_get_gp_value (output_bfd);
   2946   if (*pgp == 0
   2947       && (! relocatable
   2948 	  || (symbol->flags & BSF_SECTION_SYM) != 0))
   2949     {
   2950       if (relocatable)
   2951 	{
   2952 	  /* Make up a value.  */
   2953 	  *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
   2954 	  _bfd_set_gp_value (output_bfd, *pgp);
   2955 	}
   2956       else if (!mips_elf_assign_gp (output_bfd, pgp))
   2957 	{
   2958 	  *error_message =
   2959 	    (char *) _("GP relative relocation when _gp not defined");
   2960 	  return bfd_reloc_dangerous;
   2961 	}
   2962     }
   2963 
   2964   return bfd_reloc_ok;
   2965 }
   2966 
   2967 /* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
   2968    become the offset from the gp register.  */
   2969 
   2970 static bfd_reloc_status_type
   2971 mips_elf_gprel16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
   2972 			asymbol *symbol, void *data ATTRIBUTE_UNUSED,
   2973 			asection *input_section, bfd *output_bfd,
   2974 			char **error_message ATTRIBUTE_UNUSED)
   2975 {
   2976   bfd_boolean relocatable;
   2977   bfd_reloc_status_type ret;
   2978   bfd_vma gp;
   2979 
   2980   if (output_bfd != NULL)
   2981     relocatable = TRUE;
   2982   else
   2983     {
   2984       relocatable = FALSE;
   2985       output_bfd = symbol->section->output_section->owner;
   2986     }
   2987 
   2988   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
   2989 			   &gp);
   2990   if (ret != bfd_reloc_ok)
   2991     return ret;
   2992 
   2993   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   2994 					input_section, relocatable,
   2995 					data, gp);
   2996 }
   2997 
   2998 /* Do a R_MIPS_LITERAL relocation.  */
   2999 
   3000 static bfd_reloc_status_type
   3001 mips_elf_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   3002 			void *data, asection *input_section, bfd *output_bfd,
   3003 			char **error_message)
   3004 {
   3005   bfd_boolean relocatable;
   3006   bfd_reloc_status_type ret;
   3007   bfd_vma gp;
   3008 
   3009   /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
   3010   if (output_bfd != NULL
   3011       && (symbol->flags & BSF_SECTION_SYM) == 0
   3012       && (symbol->flags & BSF_LOCAL) != 0)
   3013     {
   3014       *error_message = (char *)
   3015 	_("literal relocation occurs for an external symbol");
   3016       return bfd_reloc_outofrange;
   3017     }
   3018 
   3019   /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
   3020   if (output_bfd != NULL)
   3021     relocatable = TRUE;
   3022   else
   3023     {
   3024       relocatable = FALSE;
   3025       output_bfd = symbol->section->output_section->owner;
   3026     }
   3027 
   3028   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
   3029 			   &gp);
   3030   if (ret != bfd_reloc_ok)
   3031     return ret;
   3032 
   3033   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   3034 					input_section, relocatable,
   3035 					data, gp);
   3036 }
   3037 
   3038 /* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
   3039    become the offset from the gp register.  */
   3040 
   3041 static bfd_reloc_status_type
   3042 mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   3043 			void *data, asection *input_section, bfd *output_bfd,
   3044 			char **error_message)
   3045 {
   3046   bfd_boolean relocatable;
   3047   bfd_reloc_status_type ret;
   3048   bfd_vma gp;
   3049 
   3050   /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
   3051   if (output_bfd != NULL
   3052       && (symbol->flags & BSF_SECTION_SYM) == 0
   3053       && (symbol->flags & BSF_LOCAL) != 0)
   3054     {
   3055       *error_message = (char *)
   3056 	_("32bits gp relative relocation occurs for an external symbol");
   3057       return bfd_reloc_outofrange;
   3058     }
   3059 
   3060   if (output_bfd != NULL)
   3061     {
   3062       relocatable = TRUE;
   3063       gp = _bfd_get_gp_value (output_bfd);
   3064     }
   3065   else
   3066     {
   3067       relocatable = FALSE;
   3068       output_bfd = symbol->section->output_section->owner;
   3069 
   3070       ret = mips_elf_final_gp (output_bfd, symbol, relocatable,
   3071 			       error_message, &gp);
   3072       if (ret != bfd_reloc_ok)
   3073 	return ret;
   3074     }
   3075 
   3076   return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
   3077 			  relocatable, data, gp);
   3078 }
   3079 
   3080 static bfd_reloc_status_type
   3081 gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry,
   3082 		 asection *input_section, bfd_boolean relocatable,
   3083 		 void *data, bfd_vma gp)
   3084 {
   3085   bfd_vma relocation;
   3086   unsigned long val;
   3087 
   3088   if (bfd_is_com_section (symbol->section))
   3089     relocation = 0;
   3090   else
   3091     relocation = symbol->value;
   3092 
   3093   relocation += symbol->section->output_section->vma;
   3094   relocation += symbol->section->output_offset;
   3095 
   3096   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
   3097     return bfd_reloc_outofrange;
   3098 
   3099   if (reloc_entry->howto->src_mask == 0)
   3100     val = 0;
   3101   else
   3102     val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
   3103 
   3104   /* Set val to the offset into the section or symbol.  */
   3105   val += reloc_entry->addend;
   3106 
   3107   /* Adjust val for the final section location and GP value.  If we
   3108      are producing relocatable output, we don't want to do this for
   3109      an external symbol.  */
   3110   if (! relocatable
   3111       || (symbol->flags & BSF_SECTION_SYM) != 0)
   3112     val += relocation - gp;
   3113 
   3114   bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
   3115 
   3116   if (relocatable)
   3117     reloc_entry->address += input_section->output_offset;
   3118 
   3119   return bfd_reloc_ok;
   3120 }
   3121 
   3122 /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
   3123    the rest is at bits 6-10. The bitpos already got right by the howto.  */
   3124 
   3125 static bfd_reloc_status_type
   3126 mips_elf_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   3127 		       void *data, asection *input_section, bfd *output_bfd,
   3128 		       char **error_message)
   3129 {
   3130   if (reloc_entry->howto->partial_inplace)
   3131     {
   3132       reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
   3133 			     | (reloc_entry->addend & 0x00000800) >> 9);
   3134     }
   3135 
   3136   return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
   3137 				      input_section, output_bfd,
   3138 				      error_message);
   3139 }
   3140 
   3141 /* Handle a mips16 GP relative reloc.  */
   3143 
   3144 static bfd_reloc_status_type
   3145 mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   3146 		    void *data, asection *input_section, bfd *output_bfd,
   3147 		    char **error_message)
   3148 {
   3149   bfd_boolean relocatable;
   3150   bfd_reloc_status_type ret;
   3151   bfd_byte *location;
   3152   bfd_vma gp;
   3153 
   3154   /* If we're relocating, and this is an external symbol, we don't want
   3155      to change anything.  */
   3156   if (output_bfd != NULL
   3157       && (symbol->flags & BSF_SECTION_SYM) == 0
   3158       && (symbol->flags & BSF_LOCAL) != 0)
   3159     {
   3160       reloc_entry->address += input_section->output_offset;
   3161       return bfd_reloc_ok;
   3162     }
   3163 
   3164   if (output_bfd != NULL)
   3165     relocatable = TRUE;
   3166   else
   3167     {
   3168       relocatable = FALSE;
   3169       output_bfd = symbol->section->output_section->owner;
   3170     }
   3171 
   3172   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
   3173 			   &gp);
   3174   if (ret != bfd_reloc_ok)
   3175     return ret;
   3176 
   3177   location = (bfd_byte *) data + reloc_entry->address;
   3178   _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
   3179 				 location);
   3180   ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   3181 				       input_section, relocatable,
   3182 				       data, gp);
   3183   _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
   3184 			       location);
   3185 
   3186   return ret;
   3187 }
   3188 
   3189 /* A mapping from BFD reloc types to MIPS ELF reloc types.  */
   3191 
   3192 struct elf_reloc_map {
   3193   bfd_reloc_code_real_type bfd_val;
   3194   enum elf_mips_reloc_type elf_val;
   3195 };
   3196 
   3197 static const struct elf_reloc_map mips_reloc_map[] =
   3198 {
   3199   { BFD_RELOC_NONE, R_MIPS_NONE },
   3200   { BFD_RELOC_16, R_MIPS_16 },
   3201   { BFD_RELOC_32, R_MIPS_32 },
   3202   /* There is no BFD reloc for R_MIPS_REL32.  */
   3203   { BFD_RELOC_CTOR, R_MIPS_32 },
   3204   { BFD_RELOC_64, R_MIPS_64 },
   3205   { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
   3206   { BFD_RELOC_HI16_S, R_MIPS_HI16 },
   3207   { BFD_RELOC_LO16, R_MIPS_LO16 },
   3208   { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
   3209   { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
   3210   { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
   3211   { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
   3212   { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
   3213   { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
   3214   { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
   3215   { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
   3216   { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
   3217   { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
   3218   { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
   3219   { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
   3220   { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
   3221   { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
   3222   { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
   3223   { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
   3224   { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
   3225   { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
   3226   { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
   3227   { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
   3228   { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
   3229   { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
   3230   { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
   3231   /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
   3232   { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
   3233   { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
   3234   { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
   3235   { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
   3236   { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
   3237   { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
   3238   { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
   3239   { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
   3240   { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
   3241   { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
   3242   { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
   3243   { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
   3244   { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
   3245   { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
   3246   { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 },
   3247   { BFD_RELOC_MIPS_21_PCREL_S2, R_MIPS_PC21_S2 },
   3248   { BFD_RELOC_MIPS_26_PCREL_S2, R_MIPS_PC26_S2 },
   3249   { BFD_RELOC_MIPS_18_PCREL_S3, R_MIPS_PC18_S3 },
   3250   { BFD_RELOC_MIPS_19_PCREL_S2, R_MIPS_PC19_S2 },
   3251   { BFD_RELOC_HI16_S_PCREL, R_MIPS_PCHI16 },
   3252   { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 }
   3253 };
   3254 
   3255 static const struct elf_reloc_map mips16_reloc_map[] =
   3256 {
   3257   { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
   3258   { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
   3259   { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
   3260   { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
   3261   { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
   3262   { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
   3263   { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
   3264   { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
   3265   { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
   3266     R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
   3267   { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
   3268     R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
   3269   { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
   3270   { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
   3271   { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min },
   3272   { BFD_RELOC_MIPS16_16_PCREL_S1, R_MIPS16_PC16_S1 - R_MIPS16_min }
   3273 };
   3274 
   3275 static const struct elf_reloc_map micromips_reloc_map[] =
   3276 {
   3277   { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min },
   3278   { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min },
   3279   { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min },
   3280   { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min },
   3281   { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min },
   3282   { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min },
   3283   { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min },
   3284   { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min },
   3285   { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min },
   3286   { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min },
   3287   { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min },
   3288   { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min },
   3289   { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min },
   3290   { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min },
   3291   { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min },
   3292   { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min },
   3293   { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min },
   3294   { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min },
   3295   { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min },
   3296   { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
   3297   { BFD_RELOC_MICROMIPS_SCN_DISP, R_MICROMIPS_SCN_DISP - R_MICROMIPS_min },
   3298   { BFD_RELOC_MICROMIPS_JALR, R_MICROMIPS_JALR - R_MICROMIPS_min },
   3299 };
   3300 
   3301 /* Given a BFD reloc type, return a howto structure.  */
   3302 
   3303 static reloc_howto_type *
   3304 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   3305 				 bfd_reloc_code_real_type code)
   3306 {
   3307   unsigned int i;
   3308   /* FIXME: We default to RELA here instead of choosing the right
   3309      relocation variant.  */
   3310   reloc_howto_type *howto_table = elf_mips_howto_table_rela;
   3311   reloc_howto_type *howto16_table = elf_mips16_howto_table_rela;
   3312   reloc_howto_type *howto_micromips_table = elf_micromips_howto_table_rela;
   3313 
   3314   for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
   3315        i++)
   3316     {
   3317       if (mips_reloc_map[i].bfd_val == code)
   3318 	return &howto_table[(int) mips_reloc_map[i].elf_val];
   3319     }
   3320 
   3321   for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
   3322        i++)
   3323     {
   3324       if (mips16_reloc_map[i].bfd_val == code)
   3325 	return &howto16_table[(int) mips16_reloc_map[i].elf_val];
   3326     }
   3327 
   3328   for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map);
   3329        i++)
   3330     {
   3331       if (micromips_reloc_map[i].bfd_val == code)
   3332 	return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val];
   3333     }
   3334 
   3335   switch (code)
   3336     {
   3337     case BFD_RELOC_VTABLE_INHERIT:
   3338       return &elf_mips_gnu_vtinherit_howto;
   3339     case BFD_RELOC_VTABLE_ENTRY:
   3340       return &elf_mips_gnu_vtentry_howto;
   3341     case BFD_RELOC_32_PCREL:
   3342       return &elf_mips_gnu_pcrel32;
   3343     case BFD_RELOC_MIPS_EH:
   3344       return &elf_mips_eh_howto;
   3345     case BFD_RELOC_MIPS_COPY:
   3346       return &elf_mips_copy_howto;
   3347     case BFD_RELOC_MIPS_JUMP_SLOT:
   3348       return &elf_mips_jump_slot_howto;
   3349     default:
   3350       bfd_set_error (bfd_error_bad_value);
   3351       return NULL;
   3352     }
   3353 }
   3354 
   3355 static reloc_howto_type *
   3356 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   3357 				 const char *r_name)
   3358 {
   3359   unsigned int i;
   3360 
   3361   for (i = 0;
   3362        i < (sizeof (elf_mips_howto_table_rela)
   3363 	    / sizeof (elf_mips_howto_table_rela[0]));
   3364        i++)
   3365     if (elf_mips_howto_table_rela[i].name != NULL
   3366 	&& strcasecmp (elf_mips_howto_table_rela[i].name, r_name) == 0)
   3367       return &elf_mips_howto_table_rela[i];
   3368 
   3369   for (i = 0;
   3370        i < (sizeof (elf_mips16_howto_table_rela)
   3371 	    / sizeof (elf_mips16_howto_table_rela[0]));
   3372        i++)
   3373     if (elf_mips16_howto_table_rela[i].name != NULL
   3374 	&& strcasecmp (elf_mips16_howto_table_rela[i].name, r_name) == 0)
   3375       return &elf_mips16_howto_table_rela[i];
   3376 
   3377   for (i = 0;
   3378        i < (sizeof (elf_micromips_howto_table_rela)
   3379 	    / sizeof (elf_micromips_howto_table_rela[0]));
   3380        i++)
   3381     if (elf_micromips_howto_table_rela[i].name != NULL
   3382 	&& strcasecmp (elf_micromips_howto_table_rela[i].name, r_name) == 0)
   3383       return &elf_micromips_howto_table_rela[i];
   3384 
   3385   if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
   3386     return &elf_mips_gnu_vtinherit_howto;
   3387   if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
   3388     return &elf_mips_gnu_vtentry_howto;
   3389   if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
   3390     return &elf_mips_gnu_rel16_s2;
   3391   if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
   3392     return &elf_mips_gnu_rela16_s2;
   3393   if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0)
   3394     return &elf_mips_gnu_pcrel32;
   3395   if (strcasecmp (elf_mips_eh_howto.name, r_name) == 0)
   3396     return &elf_mips_eh_howto;
   3397   if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
   3398     return &elf_mips_copy_howto;
   3399   if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
   3400     return &elf_mips_jump_slot_howto;
   3401 
   3402   return NULL;
   3403 }
   3404 
   3405 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
   3406 
   3407 static reloc_howto_type *
   3408 mips_elf_n32_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
   3409 {
   3410   switch (r_type)
   3411     {
   3412     case R_MIPS_GNU_VTINHERIT:
   3413       return &elf_mips_gnu_vtinherit_howto;
   3414     case R_MIPS_GNU_VTENTRY:
   3415       return &elf_mips_gnu_vtentry_howto;
   3416     case R_MIPS_GNU_REL16_S2:
   3417       if (rela_p)
   3418 	return &elf_mips_gnu_rela16_s2;
   3419       else
   3420 	return &elf_mips_gnu_rel16_s2;
   3421     case R_MIPS_PC32:
   3422       return &elf_mips_gnu_pcrel32;
   3423     case R_MIPS_EH:
   3424       return &elf_mips_eh_howto;
   3425     case R_MIPS_COPY:
   3426       return &elf_mips_copy_howto;
   3427     case R_MIPS_JUMP_SLOT:
   3428       return &elf_mips_jump_slot_howto;
   3429     default:
   3430       if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
   3431 	{
   3432 	  if (rela_p)
   3433 	    return &elf_micromips_howto_table_rela[r_type - R_MICROMIPS_min];
   3434 	  else
   3435 	    return &elf_micromips_howto_table_rel[r_type - R_MICROMIPS_min];
   3436 	}
   3437       if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
   3438 	{
   3439 	  if (rela_p)
   3440 	    return &elf_mips16_howto_table_rela[r_type - R_MIPS16_min];
   3441 	  else
   3442 	    return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
   3443 	}
   3444       if (r_type >= R_MIPS_max)
   3445 	{
   3446 	  (*_bfd_error_handler) (_("unrecognised MIPS reloc number: %d"), r_type);
   3447 	  bfd_set_error (bfd_error_bad_value);
   3448 	  r_type = R_MIPS_NONE;
   3449 	}
   3450       if (rela_p)
   3451 	return &elf_mips_howto_table_rela[r_type];
   3452       else
   3453 	return &elf_mips_howto_table_rel[r_type];
   3454       break;
   3455     }
   3456 }
   3457 
   3458 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
   3459 
   3460 static void
   3461 mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
   3462 {
   3463   unsigned int r_type;
   3464 
   3465   r_type = ELF32_R_TYPE (dst->r_info);
   3466   cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, FALSE);
   3467 
   3468   /* The addend for a GPREL16 or LITERAL relocation comes from the GP
   3469      value for the object file.  We get the addend now, rather than
   3470      when we do the relocation, because the symbol manipulations done
   3471      by the linker may cause us to lose track of the input BFD.  */
   3472   if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
   3473       && (gprel16_reloc_p (r_type) || r_type == (unsigned int) R_MIPS_LITERAL))
   3474     cache_ptr->addend = elf_gp (abfd);
   3475 }
   3476 
   3477 /* Given a MIPS Elf_Internal_Rela, fill in an arelent structure.  */
   3478 
   3479 static void
   3480 mips_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
   3481 			 arelent *cache_ptr, Elf_Internal_Rela *dst)
   3482 {
   3483   unsigned int r_type;
   3484 
   3485   r_type = ELF32_R_TYPE (dst->r_info);
   3486   cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, TRUE);
   3487   cache_ptr->addend = dst->r_addend;
   3488 }
   3489 
   3490 /* Determine whether a symbol is global for the purposes of splitting
   3492    the symbol table into global symbols and local symbols.  At least
   3493    on Irix 5, this split must be between section symbols and all other
   3494    symbols.  On most ELF targets the split is between static symbols
   3495    and externally visible symbols.  */
   3496 
   3497 static bfd_boolean
   3498 mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
   3499 {
   3500   if (SGI_COMPAT (abfd))
   3501     return (sym->flags & BSF_SECTION_SYM) == 0;
   3502   else
   3503     return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
   3504 	    || bfd_is_und_section (bfd_get_section (sym))
   3505 	    || bfd_is_com_section (bfd_get_section (sym)));
   3506 }
   3507 
   3508 /* Set the right machine number for a MIPS ELF file.  */
   3510 
   3511 static bfd_boolean
   3512 mips_elf_n32_object_p (bfd *abfd)
   3513 {
   3514   unsigned long mach;
   3515 
   3516   if (!ABI_N32_P (abfd))
   3517     return FALSE;
   3518 
   3519   /* Irix 5 and 6 are broken.  Object file symbol tables are not always
   3520      sorted correctly such that local symbols precede global symbols,
   3521      and the sh_info field in the symbol table is not always right.  */
   3522   if (SGI_COMPAT (abfd))
   3523     elf_bad_symtab (abfd) = TRUE;
   3524 
   3525   mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
   3526   bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
   3527   return TRUE;
   3528 }
   3529 
   3530 /* Support for core dump NOTE sections.  */
   3532 static bfd_boolean
   3533 elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
   3534 {
   3535   int offset;
   3536   unsigned int size;
   3537 
   3538   switch (note->descsz)
   3539     {
   3540       default:
   3541 	return FALSE;
   3542 
   3543       case 440:		/* Linux/MIPS N32 */
   3544 	/* pr_cursig */
   3545 	elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
   3546 
   3547 	/* pr_pid */
   3548 	elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
   3549 
   3550 	/* pr_reg */
   3551 	offset = 72;
   3552 	size = 360;
   3553 
   3554 	break;
   3555     }
   3556 
   3557   /* Make a ".reg/999" section.  */
   3558   return _bfd_elfcore_make_pseudosection (abfd, ".reg", size,
   3559 					  note->descpos + offset);
   3560 }
   3561 
   3562 static bfd_boolean
   3563 elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
   3564 {
   3565   switch (note->descsz)
   3566     {
   3567       default:
   3568 	return FALSE;
   3569 
   3570       case 128:		/* Linux/MIPS elf_prpsinfo */
   3571 	elf_tdata (abfd)->core->program
   3572 	 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
   3573 	elf_tdata (abfd)->core->command
   3574 	 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
   3575     }
   3576 
   3577   /* Note that for some reason, a spurious space is tacked
   3578      onto the end of the args in some (at least one anyway)
   3579      implementations, so strip it off if it exists.  */
   3580 
   3581   {
   3582     char *command = elf_tdata (abfd)->core->command;
   3583     int n = strlen (command);
   3584 
   3585     if (0 < n && command[n - 1] == ' ')
   3586       command[n - 1] = '\0';
   3587   }
   3588 
   3589   return TRUE;
   3590 }
   3591 
   3592 /* MIPS ELF local labels start with "$L".  */
   3594 static bfd_boolean
   3595 mips_elf_n32_is_local_label_name (bfd *abfd, const char *name)
   3596 {
   3597   if (name[0] == '$' && name[1] == 'L')
   3598     return TRUE;
   3599 
   3600   /* We accept the generic ELF local label syntax as well.  */
   3601   return _bfd_elf_is_local_label_name (abfd, name);
   3602 }
   3603 
   3604 /* Depending on the target vector we generate some version of Irix
   3606    executables or "normal" MIPS ELF ABI executables.  */
   3607 static irix_compat_t
   3608 elf_n32_mips_irix_compat (bfd *abfd)
   3609 {
   3610   if ((abfd->xvec == &mips_elf32_n_be_vec)
   3611       || (abfd->xvec == &mips_elf32_n_le_vec))
   3612     return ict_irix6;
   3613   else
   3614     return ict_none;
   3615 }
   3616 
   3617 /* ECOFF swapping routines.  These are used when dealing with the
   3619    .mdebug section, which is in the ECOFF debugging format.  */
   3620 static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
   3621   /* Symbol table magic number.  */
   3622   magicSym,
   3623   /* Alignment of debugging information.  E.g., 4.  */
   3624   4,
   3625   /* Sizes of external symbolic information.  */
   3626   sizeof (struct hdr_ext),
   3627   sizeof (struct dnr_ext),
   3628   sizeof (struct pdr_ext),
   3629   sizeof (struct sym_ext),
   3630   sizeof (struct opt_ext),
   3631   sizeof (struct fdr_ext),
   3632   sizeof (struct rfd_ext),
   3633   sizeof (struct ext_ext),
   3634   /* Functions to swap in external symbolic data.  */
   3635   ecoff_swap_hdr_in,
   3636   ecoff_swap_dnr_in,
   3637   ecoff_swap_pdr_in,
   3638   ecoff_swap_sym_in,
   3639   ecoff_swap_opt_in,
   3640   ecoff_swap_fdr_in,
   3641   ecoff_swap_rfd_in,
   3642   ecoff_swap_ext_in,
   3643   _bfd_ecoff_swap_tir_in,
   3644   _bfd_ecoff_swap_rndx_in,
   3645   /* Functions to swap out external symbolic data.  */
   3646   ecoff_swap_hdr_out,
   3647   ecoff_swap_dnr_out,
   3648   ecoff_swap_pdr_out,
   3649   ecoff_swap_sym_out,
   3650   ecoff_swap_opt_out,
   3651   ecoff_swap_fdr_out,
   3652   ecoff_swap_rfd_out,
   3653   ecoff_swap_ext_out,
   3654   _bfd_ecoff_swap_tir_out,
   3655   _bfd_ecoff_swap_rndx_out,
   3656   /* Function to read in symbolic data.  */
   3657   _bfd_mips_elf_read_ecoff_info
   3658 };
   3659 
   3660 #define ELF_ARCH			bfd_arch_mips
   3662 #define ELF_TARGET_ID			MIPS_ELF_DATA
   3663 #define ELF_MACHINE_CODE		EM_MIPS
   3664 
   3665 #define elf_backend_collect		TRUE
   3666 #define elf_backend_type_change_ok	TRUE
   3667 #define elf_backend_can_gc_sections	TRUE
   3668 #define elf_backend_gc_mark_extra_sections \
   3669 					_bfd_mips_elf_gc_mark_extra_sections
   3670 #define elf_info_to_howto		mips_info_to_howto_rela
   3671 #define elf_info_to_howto_rel		mips_info_to_howto_rel
   3672 #define elf_backend_sym_is_global	mips_elf_sym_is_global
   3673 #define elf_backend_object_p		mips_elf_n32_object_p
   3674 #define elf_backend_symbol_processing	_bfd_mips_elf_symbol_processing
   3675 #define elf_backend_section_processing	_bfd_mips_elf_section_processing
   3676 #define elf_backend_section_from_shdr	_bfd_mips_elf_section_from_shdr
   3677 #define elf_backend_fake_sections	_bfd_mips_elf_fake_sections
   3678 #define elf_backend_section_from_bfd_section \
   3679 					_bfd_mips_elf_section_from_bfd_section
   3680 #define elf_backend_add_symbol_hook	_bfd_mips_elf_add_symbol_hook
   3681 #define elf_backend_link_output_symbol_hook \
   3682 					_bfd_mips_elf_link_output_symbol_hook
   3683 #define elf_backend_create_dynamic_sections \
   3684 					_bfd_mips_elf_create_dynamic_sections
   3685 #define elf_backend_check_relocs	_bfd_mips_elf_check_relocs
   3686 #define elf_backend_merge_symbol_attribute \
   3687 					_bfd_mips_elf_merge_symbol_attribute
   3688 #define elf_backend_get_target_dtag	_bfd_mips_elf_get_target_dtag
   3689 #define elf_backend_adjust_dynamic_symbol \
   3690 					_bfd_mips_elf_adjust_dynamic_symbol
   3691 #define elf_backend_always_size_sections \
   3692 					_bfd_mips_elf_always_size_sections
   3693 #define elf_backend_size_dynamic_sections \
   3694 					_bfd_mips_elf_size_dynamic_sections
   3695 #define elf_backend_init_index_section	_bfd_elf_init_1_index_section
   3696 #define elf_backend_relocate_section	_bfd_mips_elf_relocate_section
   3697 #define elf_backend_finish_dynamic_symbol \
   3698 					_bfd_mips_elf_finish_dynamic_symbol
   3699 #define elf_backend_finish_dynamic_sections \
   3700 					_bfd_mips_elf_finish_dynamic_sections
   3701 #define elf_backend_final_write_processing \
   3702 					_bfd_mips_elf_final_write_processing
   3703 #define elf_backend_additional_program_headers \
   3704 					_bfd_mips_elf_additional_program_headers
   3705 #define elf_backend_modify_segment_map	_bfd_mips_elf_modify_segment_map
   3706 #define elf_backend_gc_mark_hook	_bfd_mips_elf_gc_mark_hook
   3707 #define elf_backend_gc_sweep_hook	_bfd_mips_elf_gc_sweep_hook
   3708 #define elf_backend_copy_indirect_symbol \
   3709 					_bfd_mips_elf_copy_indirect_symbol
   3710 #define elf_backend_grok_prstatus	elf32_mips_grok_prstatus
   3711 #define elf_backend_grok_psinfo		elf32_mips_grok_psinfo
   3712 #define elf_backend_ecoff_debug_swap	&mips_elf32_ecoff_debug_swap
   3713 
   3714 #define elf_backend_got_header_size	(4 * MIPS_RESERVED_GOTNO)
   3715 
   3716 /* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations
   3717    work better/work only in RELA, so we default to this.  */
   3718 #define elf_backend_may_use_rel_p	1
   3719 #define elf_backend_may_use_rela_p	1
   3720 #define elf_backend_default_use_rela_p	1
   3721 #define elf_backend_rela_plts_and_copies_p 0
   3722 #define elf_backend_sign_extend_vma	TRUE
   3723 #define elf_backend_plt_readonly	1
   3724 #define elf_backend_plt_sym_val		_bfd_mips_elf_plt_sym_val
   3725 
   3726 #define elf_backend_discard_info	_bfd_mips_elf_discard_info
   3727 #define elf_backend_ignore_discarded_relocs \
   3728 					_bfd_mips_elf_ignore_discarded_relocs
   3729 #define elf_backend_write_section	_bfd_mips_elf_write_section
   3730 #define elf_backend_mips_irix_compat	elf_n32_mips_irix_compat
   3731 #define elf_backend_mips_rtype_to_howto	mips_elf_n32_rtype_to_howto
   3732 
   3733 #define bfd_elf32_bfd_is_local_label_name \
   3734 					mips_elf_n32_is_local_label_name
   3735 #define bfd_elf32_bfd_is_target_special_symbol \
   3736 					_bfd_mips_elf_is_target_special_symbol
   3737 #define bfd_elf32_find_nearest_line	_bfd_mips_elf_find_nearest_line
   3738 #define bfd_elf32_find_inliner_info	_bfd_mips_elf_find_inliner_info
   3739 #define bfd_elf32_new_section_hook	_bfd_mips_elf_new_section_hook
   3740 #define bfd_elf32_set_section_contents	_bfd_mips_elf_set_section_contents
   3741 #define bfd_elf32_bfd_get_relocated_section_contents \
   3742 				_bfd_elf_mips_get_relocated_section_contents
   3743 #define bfd_elf32_bfd_link_hash_table_create \
   3744 					_bfd_mips_elf_link_hash_table_create
   3745 #define bfd_elf32_bfd_final_link	_bfd_mips_elf_final_link
   3746 #define bfd_elf32_bfd_merge_private_bfd_data \
   3747 					_bfd_mips_elf_merge_private_bfd_data
   3748 #define bfd_elf32_bfd_set_private_flags	_bfd_mips_elf_set_private_flags
   3749 #define bfd_elf32_bfd_print_private_bfd_data \
   3750 					_bfd_mips_elf_print_private_bfd_data
   3751 #define bfd_elf32_bfd_relax_section     _bfd_mips_relax_section
   3752 #define bfd_elf32_mkobject		_bfd_mips_elf_mkobject
   3753 
   3754 /* Support for SGI-ish mips targets using n32 ABI.  */
   3755 
   3756 #define TARGET_LITTLE_SYM               mips_elf32_n_le_vec
   3757 #define TARGET_LITTLE_NAME              "elf32-nlittlemips"
   3758 #define TARGET_BIG_SYM                  mips_elf32_n_be_vec
   3759 #define TARGET_BIG_NAME                 "elf32-nbigmips"
   3760 
   3761 #define ELF_MAXPAGESIZE			0x10000
   3762 #define ELF_COMMONPAGESIZE		0x1000
   3763 
   3764 #include "elf32-target.h"
   3765 
   3766 /* Support for traditional mips targets using n32 ABI.  */
   3767 #undef TARGET_LITTLE_SYM
   3768 #undef TARGET_LITTLE_NAME
   3769 #undef TARGET_BIG_SYM
   3770 #undef TARGET_BIG_NAME
   3771 
   3772 #undef ELF_MAXPAGESIZE
   3773 #undef ELF_COMMONPAGESIZE
   3774 
   3775 #define TARGET_LITTLE_SYM               mips_elf32_ntrad_le_vec
   3776 #define TARGET_LITTLE_NAME              "elf32-ntradlittlemips"
   3777 #define TARGET_BIG_SYM                  mips_elf32_ntrad_be_vec
   3778 #define TARGET_BIG_NAME                 "elf32-ntradbigmips"
   3779 
   3780 #define ELF_MAXPAGESIZE			0x10000
   3781 #define ELF_COMMONPAGESIZE		0x1000
   3782 #define elf32_bed			elf32_tradbed
   3783 
   3784 /* Include the target file again for this target.  */
   3785 #include "elf32-target.h"
   3786 
   3787 
   3788 /* FreeBSD support.  */
   3789 
   3790 #undef TARGET_LITTLE_SYM
   3791 #undef TARGET_LITTLE_NAME
   3792 #undef TARGET_BIG_SYM
   3793 #undef TARGET_BIG_NAME
   3794 
   3795 #define	TARGET_LITTLE_SYM		mips_elf32_ntradfbsd_le_vec
   3796 #define	TARGET_LITTLE_NAME		"elf32-ntradlittlemips-freebsd"
   3797 #define	TARGET_BIG_SYM			mips_elf32_ntradfbsd_be_vec
   3798 #define	TARGET_BIG_NAME			"elf32-ntradbigmips-freebsd"
   3799 
   3800 #undef	ELF_OSABI
   3801 #define	ELF_OSABI			ELFOSABI_FREEBSD
   3802 
   3803 #undef	elf32_bed
   3804 #define elf32_bed				elf32_fbsd_tradbed
   3805 
   3806 #include "elf32-target.h"
   3807