Home | History | Annotate | Line # | Download | only in bfd
elfn32-mips.c revision 1.1.1.8
      1 /* MIPS-specific support for 32-bit ELF
      2    Copyright (C) 1993-2019 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 bfd_boolean mips_info_to_howto_rel
     70   (bfd *, arelent *, Elf_Internal_Rela *);
     71 static bfd_boolean mips_info_to_howto_rela
     72   (bfd *, arelent *, Elf_Internal_Rela *);
     73 static bfd_boolean mips_elf_sym_is_global
     74   (bfd *, asymbol *);
     75 static bfd_boolean mips_elf_n32_object_p
     76   (bfd *);
     77 static bfd_boolean elf32_mips_grok_prstatus
     78   (bfd *, Elf_Internal_Note *);
     79 static bfd_boolean elf32_mips_grok_psinfo
     80   (bfd *, Elf_Internal_Note *);
     81 static bfd_boolean elf_n32_mips_grok_freebsd_prstatus
     82   (bfd *, Elf_Internal_Note *);
     83 static irix_compat_t elf_n32_mips_irix_compat
     84   (bfd *);
     85 static bfd_boolean mips_elf_n32_mkobject
     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   /* Low 16 bits of symbol value.  Note that the high 16 bits of symbol values
   2404      must be zero.  This is used for relaxation.  */
   2405   HOWTO (R_MICROMIPS_HI0_LO16,	/* type */
   2406 	 0,			/* rightshift */
   2407 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2408 	 16,			/* bitsize */
   2409 	 FALSE,			/* pc_relative */
   2410 	 0,			/* bitpos */
   2411 	 complain_overflow_dont, /* complain_on_overflow */
   2412 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2413 	 "R_MICROMIPS_HI0_LO16",/* name */
   2414 	 TRUE,			/* partial_inplace */
   2415 	 0x0000ffff,		/* src_mask */
   2416 	 0x0000ffff,		/* dst_mask */
   2417 	 FALSE),		/* pcrel_offset */
   2418 
   2419   EMPTY_HOWTO (158),
   2420   EMPTY_HOWTO (159),
   2421   EMPTY_HOWTO (160),
   2422   EMPTY_HOWTO (161),
   2423 
   2424   /* TLS general dynamic variable reference.  */
   2425   HOWTO (R_MICROMIPS_TLS_GD,		/* type */
   2426 	 0,			/* rightshift */
   2427 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2428 	 16,			/* bitsize */
   2429 	 FALSE,			/* pc_relative */
   2430 	 0,			/* bitpos */
   2431 	 complain_overflow_signed, /* complain_on_overflow */
   2432 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2433 	 "R_MICROMIPS_TLS_GD",	/* name */
   2434 	 TRUE,			/* partial_inplace */
   2435 	 0x0000ffff,		/* src_mask */
   2436 	 0x0000ffff,		/* dst_mask */
   2437 	 FALSE),		/* pcrel_offset */
   2438 
   2439   /* TLS local dynamic variable reference.  */
   2440   HOWTO (R_MICROMIPS_TLS_LDM,	/* type */
   2441 	 0,			/* rightshift */
   2442 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2443 	 16,			/* bitsize */
   2444 	 FALSE,			/* pc_relative */
   2445 	 0,			/* bitpos */
   2446 	 complain_overflow_signed, /* complain_on_overflow */
   2447 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2448 	 "R_MICROMIPS_TLS_LDM",	/* name */
   2449 	 TRUE,			/* partial_inplace */
   2450 	 0x0000ffff,		/* src_mask */
   2451 	 0x0000ffff,		/* dst_mask */
   2452 	 FALSE),		/* pcrel_offset */
   2453 
   2454   /* TLS local dynamic offset.  */
   2455   HOWTO (R_MICROMIPS_TLS_DTPREL_HI16,	/* type */
   2456 	 0,			/* rightshift */
   2457 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2458 	 16,			/* bitsize */
   2459 	 FALSE,			/* pc_relative */
   2460 	 0,			/* bitpos */
   2461 	 complain_overflow_signed, /* complain_on_overflow */
   2462 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2463 	 "R_MICROMIPS_TLS_DTPREL_HI16",	/* name */
   2464 	 TRUE,			/* partial_inplace */
   2465 	 0x0000ffff,		/* src_mask */
   2466 	 0x0000ffff,		/* dst_mask */
   2467 	 FALSE),		/* pcrel_offset */
   2468 
   2469   /* TLS local dynamic offset.  */
   2470   HOWTO (R_MICROMIPS_TLS_DTPREL_LO16,	/* type */
   2471 	 0,			/* rightshift */
   2472 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2473 	 16,			/* bitsize */
   2474 	 FALSE,			/* pc_relative */
   2475 	 0,			/* bitpos */
   2476 	 complain_overflow_signed, /* complain_on_overflow */
   2477 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2478 	 "R_MICROMIPS_TLS_DTPREL_LO16",	/* name */
   2479 	 TRUE,			/* partial_inplace */
   2480 	 0x0000ffff,		/* src_mask */
   2481 	 0x0000ffff,		/* dst_mask */
   2482 	 FALSE),		/* pcrel_offset */
   2483 
   2484   /* TLS thread pointer offset.  */
   2485   HOWTO (R_MICROMIPS_TLS_GOTTPREL,	/* type */
   2486 	 0,			/* rightshift */
   2487 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2488 	 16,			/* bitsize */
   2489 	 FALSE,			/* pc_relative */
   2490 	 0,			/* bitpos */
   2491 	 complain_overflow_signed, /* complain_on_overflow */
   2492 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2493 	 "R_MICROMIPS_TLS_GOTTPREL",	/* name */
   2494 	 TRUE,			/* partial_inplace */
   2495 	 0x0000ffff,		/* src_mask */
   2496 	 0x0000ffff,		/* dst_mask */
   2497 	 FALSE),		/* pcrel_offset */
   2498 
   2499   EMPTY_HOWTO (167),
   2500   EMPTY_HOWTO (168),
   2501 
   2502   /* TLS thread pointer offset.  */
   2503   HOWTO (R_MICROMIPS_TLS_TPREL_HI16,	/* type */
   2504 	 0,			/* rightshift */
   2505 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2506 	 16,			/* bitsize */
   2507 	 FALSE,			/* pc_relative */
   2508 	 0,			/* bitpos */
   2509 	 complain_overflow_signed, /* complain_on_overflow */
   2510 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2511 	 "R_MICROMIPS_TLS_TPREL_HI16", /* name */
   2512 	 TRUE,			/* partial_inplace */
   2513 	 0x0000ffff,		/* src_mask */
   2514 	 0x0000ffff,		/* dst_mask */
   2515 	 FALSE),		/* pcrel_offset */
   2516 
   2517   /* TLS thread pointer offset.  */
   2518   HOWTO (R_MICROMIPS_TLS_TPREL_LO16,	/* type */
   2519 	 0,			/* rightshift */
   2520 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2521 	 16,			/* bitsize */
   2522 	 FALSE,			/* pc_relative */
   2523 	 0,			/* bitpos */
   2524 	 complain_overflow_signed, /* complain_on_overflow */
   2525 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2526 	 "R_MICROMIPS_TLS_TPREL_LO16", /* name */
   2527 	 TRUE,			/* partial_inplace */
   2528 	 0x0000ffff,		/* src_mask */
   2529 	 0x0000ffff,		/* dst_mask */
   2530 	 FALSE),		/* pcrel_offset */
   2531 
   2532   EMPTY_HOWTO (171),
   2533 
   2534   /* GP- and PC-relative relocations.  */
   2535   HOWTO (R_MICROMIPS_GPREL7_S2,	/* type */
   2536 	 2,			/* rightshift */
   2537 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   2538 	 7,			/* bitsize */
   2539 	 FALSE,			/* pc_relative */
   2540 	 0,			/* bitpos */
   2541 	 complain_overflow_signed, /* complain_on_overflow */
   2542 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
   2543 	 "R_MICROMIPS_GPREL7_S2",	/* name */
   2544 	 TRUE,			/* partial_inplace */
   2545 	 0x0000007f,		/* src_mask */
   2546 	 0x0000007f,		/* dst_mask */
   2547 	 FALSE),		/* pcrel_offset */
   2548 
   2549   HOWTO (R_MICROMIPS_PC23_S2,	/* type */
   2550 	 2,			/* rightshift */
   2551 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2552 	 23,			/* bitsize */
   2553 	 TRUE,			/* pc_relative */
   2554 	 0,			/* bitpos */
   2555 	 complain_overflow_signed, /* complain_on_overflow */
   2556 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2557 	 "R_MICROMIPS_PC23_S2",	/* name */
   2558 	 TRUE,			/* partial_inplace */
   2559 	 0x007fffff,		/* src_mask */
   2560 	 0x007fffff,		/* dst_mask */
   2561 	 TRUE),			/* pcrel_offset */
   2562 };
   2563 
   2564 static reloc_howto_type elf_micromips_howto_table_rela[] =
   2565 {
   2566   EMPTY_HOWTO (130),
   2567   EMPTY_HOWTO (131),
   2568   EMPTY_HOWTO (132),
   2569 
   2570   /* 26 bit jump address.  */
   2571   HOWTO (R_MICROMIPS_26_S1,	/* type */
   2572 	 1,			/* rightshift */
   2573 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2574 	 26,			/* bitsize */
   2575 	 FALSE,			/* pc_relative */
   2576 	 0,			/* bitpos */
   2577 	 complain_overflow_dont, /* complain_on_overflow */
   2578 				/* This needs complex overflow
   2579 				   detection, because the upper four
   2580 				   bits must match the PC.  */
   2581 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2582 	 "R_MICROMIPS_26_S1",	/* name */
   2583 	 FALSE,			/* partial_inplace */
   2584 	 0,			/* src_mask */
   2585 	 0x3ffffff,		/* dst_mask */
   2586 	 FALSE),		/* pcrel_offset */
   2587 
   2588   /* High 16 bits of symbol value.  */
   2589   HOWTO (R_MICROMIPS_HI16,	/* type */
   2590 	 16,			/* rightshift */
   2591 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2592 	 16,			/* bitsize */
   2593 	 FALSE,			/* pc_relative */
   2594 	 0,			/* bitpos */
   2595 	 complain_overflow_dont, /* complain_on_overflow */
   2596 	 _bfd_mips_elf_hi16_reloc, /* special_function */
   2597 	 "R_MICROMIPS_HI16",	/* name */
   2598 	 FALSE,			/* partial_inplace */
   2599 	 0,			/* src_mask */
   2600 	 0x0000ffff,		/* dst_mask */
   2601 	 FALSE),		/* pcrel_offset */
   2602 
   2603   /* Low 16 bits of symbol value.  */
   2604   HOWTO (R_MICROMIPS_LO16,	/* type */
   2605 	 0,			/* rightshift */
   2606 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2607 	 16,			/* bitsize */
   2608 	 FALSE,			/* pc_relative */
   2609 	 0,			/* bitpos */
   2610 	 complain_overflow_dont, /* complain_on_overflow */
   2611 	 _bfd_mips_elf_lo16_reloc, /* special_function */
   2612 	 "R_MICROMIPS_LO16",	/* name */
   2613 	 FALSE,			/* partial_inplace */
   2614 	 0,			/* src_mask */
   2615 	 0x0000ffff,		/* dst_mask */
   2616 	 FALSE),		/* pcrel_offset */
   2617 
   2618   /* GP relative reference.  */
   2619   HOWTO (R_MICROMIPS_GPREL16,	/* type */
   2620 	 0,			/* rightshift */
   2621 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2622 	 16,			/* bitsize */
   2623 	 FALSE,			/* pc_relative */
   2624 	 0,			/* bitpos */
   2625 	 complain_overflow_signed, /* complain_on_overflow */
   2626 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
   2627 	 "R_MICROMIPS_GPREL16",	/* name */
   2628 	 FALSE,			/* partial_inplace */
   2629 	 0,			/* src_mask */
   2630 	 0x0000ffff,		/* dst_mask */
   2631 	 FALSE),		/* pcrel_offset */
   2632 
   2633   /* Reference to literal section.  */
   2634   HOWTO (R_MICROMIPS_LITERAL,	/* type */
   2635 	 0,			/* rightshift */
   2636 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2637 	 16,			/* bitsize */
   2638 	 FALSE,			/* pc_relative */
   2639 	 0,			/* bitpos */
   2640 	 complain_overflow_signed, /* complain_on_overflow */
   2641 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
   2642 	 "R_MICROMIPS_LITERAL",	/* name */
   2643 	 FALSE,			/* partial_inplace */
   2644 	 0,			/* src_mask */
   2645 	 0x0000ffff,		/* dst_mask */
   2646 	 FALSE),		/* pcrel_offset */
   2647 
   2648   /* Reference to global offset table.  */
   2649   HOWTO (R_MICROMIPS_GOT16,	/* type */
   2650 	 0,			/* rightshift */
   2651 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2652 	 16,			/* bitsize */
   2653 	 FALSE,			/* pc_relative */
   2654 	 0,			/* bitpos */
   2655 	 complain_overflow_signed, /* complain_on_overflow */
   2656 	 _bfd_mips_elf_got16_reloc, /* special_function */
   2657 	 "R_MICROMIPS_GOT16",	/* name */
   2658 	 FALSE,			/* partial_inplace */
   2659 	 0,			/* src_mask */
   2660 	 0x0000ffff,		/* dst_mask */
   2661 	 FALSE),		/* pcrel_offset */
   2662 
   2663   /* This is for microMIPS branches.  */
   2664   HOWTO (R_MICROMIPS_PC7_S1,	/* type */
   2665 	 1,			/* rightshift */
   2666 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   2667 	 7,			/* bitsize */
   2668 	 TRUE,			/* pc_relative */
   2669 	 0,			/* bitpos */
   2670 	 complain_overflow_signed, /* complain_on_overflow */
   2671 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2672 	 "R_MICROMIPS_PC7_S1",	/* name */
   2673 	 FALSE,			/* partial_inplace */
   2674 	 0,			/* src_mask */
   2675 	 0x0000007f,		/* dst_mask */
   2676 	 TRUE),			/* pcrel_offset */
   2677 
   2678   HOWTO (R_MICROMIPS_PC10_S1,	/* type */
   2679 	 1,			/* rightshift */
   2680 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   2681 	 10,			/* bitsize */
   2682 	 TRUE,			/* pc_relative */
   2683 	 0,			/* bitpos */
   2684 	 complain_overflow_signed, /* complain_on_overflow */
   2685 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2686 	 "R_MICROMIPS_PC10_S1",	/* name */
   2687 	 FALSE,			/* partial_inplace */
   2688 	 0,			/* src_mask */
   2689 	 0x000003ff,		/* dst_mask */
   2690 	 TRUE),			/* pcrel_offset */
   2691 
   2692   HOWTO (R_MICROMIPS_PC16_S1,	/* type */
   2693 	 1,			/* rightshift */
   2694 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2695 	 16,			/* bitsize */
   2696 	 TRUE,			/* pc_relative */
   2697 	 0,			/* bitpos */
   2698 	 complain_overflow_signed, /* complain_on_overflow */
   2699 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2700 	 "R_MICROMIPS_PC16_S1",	/* name */
   2701 	 FALSE,			/* partial_inplace */
   2702 	 0,			/* src_mask */
   2703 	 0x0000ffff,		/* dst_mask */
   2704 	 TRUE),			/* pcrel_offset */
   2705 
   2706   /* 16 bit call through global offset table.  */
   2707   HOWTO (R_MICROMIPS_CALL16,	/* type */
   2708 	 0,			/* rightshift */
   2709 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2710 	 16,			/* bitsize */
   2711 	 FALSE,			/* pc_relative */
   2712 	 0,			/* bitpos */
   2713 	 complain_overflow_signed, /* complain_on_overflow */
   2714 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2715 	 "R_MICROMIPS_CALL16",	/* name */
   2716 	 FALSE,			/* partial_inplace */
   2717 	 0,			/* src_mask */
   2718 	 0x0000ffff,		/* dst_mask */
   2719 	 FALSE),		/* pcrel_offset */
   2720 
   2721   EMPTY_HOWTO (143),
   2722   EMPTY_HOWTO (144),
   2723 
   2724   /* Displacement in the global offset table.  */
   2725   HOWTO (R_MICROMIPS_GOT_DISP,	/* type */
   2726 	 0,			/* rightshift */
   2727 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2728 	 16,			/* bitsize */
   2729 	 FALSE,			/* pc_relative */
   2730 	 0,			/* bitpos */
   2731 	 complain_overflow_signed, /* complain_on_overflow */
   2732 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2733 	 "R_MICROMIPS_GOT_DISP",/* name */
   2734 	 FALSE,			/* partial_inplace */
   2735 	 0,			/* src_mask */
   2736 	 0x0000ffff,		/* dst_mask */
   2737 	 FALSE),		/* pcrel_offset */
   2738 
   2739   /* Displacement to page pointer in the global offset table.  */
   2740   HOWTO (R_MICROMIPS_GOT_PAGE,	/* type */
   2741 	 0,			/* rightshift */
   2742 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2743 	 16,			/* bitsize */
   2744 	 FALSE,			/* pc_relative */
   2745 	 0,			/* bitpos */
   2746 	 complain_overflow_signed, /* complain_on_overflow */
   2747 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2748 	 "R_MICROMIPS_GOT_PAGE",/* name */
   2749 	 FALSE,			/* partial_inplace */
   2750 	 0,			/* src_mask */
   2751 	 0x0000ffff,		/* dst_mask */
   2752 	 FALSE),		/* pcrel_offset */
   2753 
   2754   /* Offset from page pointer in the global offset table.  */
   2755   HOWTO (R_MICROMIPS_GOT_OFST,	/* type */
   2756 	 0,			/* rightshift */
   2757 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2758 	 16,			/* bitsize */
   2759 	 FALSE,			/* pc_relative */
   2760 	 0,			/* bitpos */
   2761 	 complain_overflow_signed, /* complain_on_overflow */
   2762 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2763 	 "R_MICROMIPS_GOT_OFST",/* name */
   2764 	 FALSE,			/* partial_inplace */
   2765 	 0,			/* src_mask */
   2766 	 0x0000ffff,		/* dst_mask */
   2767 	 FALSE),		/* pcrel_offset */
   2768 
   2769   /* High 16 bits of displacement in global offset table.  */
   2770   HOWTO (R_MICROMIPS_GOT_HI16,	/* type */
   2771 	 0,			/* rightshift */
   2772 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2773 	 16,			/* bitsize */
   2774 	 FALSE,			/* pc_relative */
   2775 	 0,			/* bitpos */
   2776 	 complain_overflow_dont, /* complain_on_overflow */
   2777 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2778 	 "R_MICROMIPS_GOT_HI16",/* name */
   2779 	 FALSE,			/* partial_inplace */
   2780 	 0,			/* src_mask */
   2781 	 0x0000ffff,		/* dst_mask */
   2782 	 FALSE),		/* pcrel_offset */
   2783 
   2784   /* Low 16 bits of displacement in global offset table.  */
   2785   HOWTO (R_MICROMIPS_GOT_LO16,	/* type */
   2786 	 0,			/* rightshift */
   2787 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2788 	 16,			/* bitsize */
   2789 	 FALSE,			/* pc_relative */
   2790 	 0,			/* bitpos */
   2791 	 complain_overflow_dont, /* complain_on_overflow */
   2792 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2793 	 "R_MICROMIPS_GOT_LO16",/* name */
   2794 	 FALSE,			/* partial_inplace */
   2795 	 0,			/* src_mask */
   2796 	 0x0000ffff,		/* dst_mask */
   2797 	 FALSE),		/* pcrel_offset */
   2798 
   2799   /* 64 bit subtraction.  Used in the N32 ABI.  */
   2800   HOWTO (R_MICROMIPS_SUB,	/* type */
   2801 	 0,			/* rightshift */
   2802 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   2803 	 64,			/* bitsize */
   2804 	 FALSE,			/* pc_relative */
   2805 	 0,			/* bitpos */
   2806 	 complain_overflow_dont, /* complain_on_overflow */
   2807 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2808 	 "R_MICROMIPS_SUB",	/* name */
   2809 	 FALSE,			/* partial_inplace */
   2810 	 0,			/* src_mask */
   2811 	 MINUS_ONE,		/* dst_mask */
   2812 	 FALSE),		/* pcrel_offset */
   2813 
   2814   /* Get the higher value of a 64 bit addend.  */
   2815   HOWTO (R_MICROMIPS_HIGHER,	/* type */
   2816 	 0,			/* rightshift */
   2817 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2818 	 16,			/* bitsize */
   2819 	 FALSE,			/* pc_relative */
   2820 	 0,			/* bitpos */
   2821 	 complain_overflow_dont, /* complain_on_overflow */
   2822 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2823 	 "R_MICROMIPS_HIGHER",	/* name */
   2824 	 FALSE,			/* partial_inplace */
   2825 	 0,			/* src_mask */
   2826 	 0x0000ffff,		/* dst_mask */
   2827 	 FALSE),		/* pcrel_offset */
   2828 
   2829   /* Get the highest value of a 64 bit addend.  */
   2830   HOWTO (R_MICROMIPS_HIGHEST,	/* type */
   2831 	 0,			/* rightshift */
   2832 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2833 	 16,			/* bitsize */
   2834 	 FALSE,			/* pc_relative */
   2835 	 0,			/* bitpos */
   2836 	 complain_overflow_dont, /* complain_on_overflow */
   2837 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2838 	 "R_MICROMIPS_HIGHEST",	/* name */
   2839 	 FALSE,			/* partial_inplace */
   2840 	 0,			/* src_mask */
   2841 	 0x0000ffff,		/* dst_mask */
   2842 	 FALSE),		/* pcrel_offset */
   2843 
   2844   /* High 16 bits of displacement in global offset table.  */
   2845   HOWTO (R_MICROMIPS_CALL_HI16,	/* type */
   2846 	 0,			/* rightshift */
   2847 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2848 	 16,			/* bitsize */
   2849 	 FALSE,			/* pc_relative */
   2850 	 0,			/* bitpos */
   2851 	 complain_overflow_dont, /* complain_on_overflow */
   2852 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2853 	 "R_MICROMIPS_CALL_HI16",/* name */
   2854 	 FALSE,			/* partial_inplace */
   2855 	 0,			/* src_mask */
   2856 	 0x0000ffff,		/* dst_mask */
   2857 	 FALSE),		/* pcrel_offset */
   2858 
   2859   /* Low 16 bits of displacement in global offset table.  */
   2860   HOWTO (R_MICROMIPS_CALL_LO16,	/* type */
   2861 	 0,			/* rightshift */
   2862 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2863 	 16,			/* bitsize */
   2864 	 FALSE,			/* pc_relative */
   2865 	 0,			/* bitpos */
   2866 	 complain_overflow_dont, /* complain_on_overflow */
   2867 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2868 	 "R_MICROMIPS_CALL_LO16",/* name */
   2869 	 FALSE,			/* partial_inplace */
   2870 	 0,			/* src_mask */
   2871 	 0x0000ffff,		/* dst_mask */
   2872 	 FALSE),		/* pcrel_offset */
   2873 
   2874   /* Section displacement.  */
   2875   HOWTO (R_MICROMIPS_SCN_DISP,  /* type */
   2876 	 0,			/* rightshift */
   2877 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2878 	 32,			/* bitsize */
   2879 	 FALSE,			/* pc_relative */
   2880 	 0,			/* bitpos */
   2881 	 complain_overflow_dont, /* complain_on_overflow */
   2882 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2883 	 "R_MICROMIPS_SCN_DISP", /* name */
   2884 	 FALSE,			/* partial_inplace */
   2885 	 0,			/* src_mask */
   2886 	 0xffffffff,		/* dst_mask */
   2887 	 FALSE),		/* pcrel_offset */
   2888 
   2889   /* Protected jump conversion.  This is an optimization hint.  No
   2890      relocation is required for correctness.  */
   2891   HOWTO (R_MICROMIPS_JALR,	/* type */
   2892 	 0,			/* rightshift */
   2893 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2894 	 32,			/* bitsize */
   2895 	 FALSE,			/* pc_relative */
   2896 	 0,			/* bitpos */
   2897 	 complain_overflow_dont, /* complain_on_overflow */
   2898 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2899 	 "R_MICROMIPS_JALR",	/* name */
   2900 	 FALSE,			/* partial_inplace */
   2901 	 0,			/* src_mask */
   2902 	 0x00000000,		/* dst_mask */
   2903 	 FALSE),		/* pcrel_offset */
   2904 
   2905   /* Low 16 bits of symbol value.  Note that the high 16 bits of symbol values
   2906      must be zero.  This is used for relaxation.  */
   2907   HOWTO (R_MICROMIPS_HI0_LO16,	/* type */
   2908 	 0,			/* rightshift */
   2909 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2910 	 16,			/* bitsize */
   2911 	 FALSE,			/* pc_relative */
   2912 	 0,			/* bitpos */
   2913 	 complain_overflow_dont, /* complain_on_overflow */
   2914 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2915 	 "R_MICROMIPS_HI0_LO16",/* name */
   2916 	 FALSE,			/* partial_inplace */
   2917 	 0,			/* src_mask */
   2918 	 0x0000ffff,		/* dst_mask */
   2919 	 FALSE),		/* pcrel_offset */
   2920 
   2921   EMPTY_HOWTO (158),
   2922   EMPTY_HOWTO (159),
   2923   EMPTY_HOWTO (160),
   2924   EMPTY_HOWTO (161),
   2925 
   2926   /* TLS general dynamic variable reference.  */
   2927   HOWTO (R_MICROMIPS_TLS_GD,		/* type */
   2928 	 0,			/* rightshift */
   2929 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2930 	 16,			/* bitsize */
   2931 	 FALSE,			/* pc_relative */
   2932 	 0,			/* bitpos */
   2933 	 complain_overflow_signed, /* complain_on_overflow */
   2934 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2935 	 "R_MICROMIPS_TLS_GD",	/* name */
   2936 	 FALSE,			/* partial_inplace */
   2937 	 0,			/* src_mask */
   2938 	 0x0000ffff,		/* dst_mask */
   2939 	 FALSE),		/* pcrel_offset */
   2940 
   2941   /* TLS local dynamic variable reference.  */
   2942   HOWTO (R_MICROMIPS_TLS_LDM,	/* type */
   2943 	 0,			/* rightshift */
   2944 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2945 	 16,			/* bitsize */
   2946 	 FALSE,			/* pc_relative */
   2947 	 0,			/* bitpos */
   2948 	 complain_overflow_signed, /* complain_on_overflow */
   2949 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2950 	 "R_MICROMIPS_TLS_LDM",	/* name */
   2951 	 FALSE,			/* partial_inplace */
   2952 	 0,			/* src_mask */
   2953 	 0x0000ffff,		/* dst_mask */
   2954 	 FALSE),		/* pcrel_offset */
   2955 
   2956   /* TLS local dynamic offset.  */
   2957   HOWTO (R_MICROMIPS_TLS_DTPREL_HI16,	/* type */
   2958 	 0,			/* rightshift */
   2959 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2960 	 16,			/* bitsize */
   2961 	 FALSE,			/* pc_relative */
   2962 	 0,			/* bitpos */
   2963 	 complain_overflow_signed, /* complain_on_overflow */
   2964 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2965 	 "R_MICROMIPS_TLS_DTPREL_HI16",	/* name */
   2966 	 FALSE,			/* partial_inplace */
   2967 	 0,			/* src_mask */
   2968 	 0x0000ffff,		/* dst_mask */
   2969 	 FALSE),		/* pcrel_offset */
   2970 
   2971   /* TLS local dynamic offset.  */
   2972   HOWTO (R_MICROMIPS_TLS_DTPREL_LO16,	/* type */
   2973 	 0,			/* rightshift */
   2974 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2975 	 16,			/* bitsize */
   2976 	 FALSE,			/* pc_relative */
   2977 	 0,			/* bitpos */
   2978 	 complain_overflow_signed, /* complain_on_overflow */
   2979 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2980 	 "R_MICROMIPS_TLS_DTPREL_LO16",	/* name */
   2981 	 FALSE,			/* partial_inplace */
   2982 	 0,			/* src_mask */
   2983 	 0x0000ffff,		/* dst_mask */
   2984 	 FALSE),		/* pcrel_offset */
   2985 
   2986   /* TLS thread pointer offset.  */
   2987   HOWTO (R_MICROMIPS_TLS_GOTTPREL,	/* type */
   2988 	 0,			/* rightshift */
   2989 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   2990 	 16,			/* bitsize */
   2991 	 FALSE,			/* pc_relative */
   2992 	 0,			/* bitpos */
   2993 	 complain_overflow_signed, /* complain_on_overflow */
   2994 	 _bfd_mips_elf_generic_reloc, /* special_function */
   2995 	 "R_MICROMIPS_TLS_GOTTPREL",	/* name */
   2996 	 FALSE,			/* partial_inplace */
   2997 	 0,			/* src_mask */
   2998 	 0x0000ffff,		/* dst_mask */
   2999 	 FALSE),		/* pcrel_offset */
   3000 
   3001   EMPTY_HOWTO (167),
   3002   EMPTY_HOWTO (168),
   3003 
   3004   /* TLS thread pointer offset.  */
   3005   HOWTO (R_MICROMIPS_TLS_TPREL_HI16,	/* type */
   3006 	 0,			/* rightshift */
   3007 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   3008 	 16,			/* bitsize */
   3009 	 FALSE,			/* pc_relative */
   3010 	 0,			/* bitpos */
   3011 	 complain_overflow_signed, /* complain_on_overflow */
   3012 	 _bfd_mips_elf_generic_reloc, /* special_function */
   3013 	 "R_MICROMIPS_TLS_TPREL_HI16", /* name */
   3014 	 FALSE,			/* partial_inplace */
   3015 	 0,			/* src_mask */
   3016 	 0x0000ffff,		/* dst_mask */
   3017 	 FALSE),		/* pcrel_offset */
   3018 
   3019   /* TLS thread pointer offset.  */
   3020   HOWTO (R_MICROMIPS_TLS_TPREL_LO16,	/* type */
   3021 	 0,			/* rightshift */
   3022 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   3023 	 16,			/* bitsize */
   3024 	 FALSE,			/* pc_relative */
   3025 	 0,			/* bitpos */
   3026 	 complain_overflow_signed, /* complain_on_overflow */
   3027 	 _bfd_mips_elf_generic_reloc, /* special_function */
   3028 	 "R_MICROMIPS_TLS_TPREL_LO16", /* name */
   3029 	 FALSE,			/* partial_inplace */
   3030 	 0,			/* src_mask */
   3031 	 0x0000ffff,		/* dst_mask */
   3032 	 FALSE),		/* pcrel_offset */
   3033 
   3034   EMPTY_HOWTO (171),
   3035 
   3036   /* GP- and PC-relative relocations.  */
   3037   HOWTO (R_MICROMIPS_GPREL7_S2,	/* type */
   3038 	 2,			/* rightshift */
   3039 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   3040 	 7,			/* bitsize */
   3041 	 FALSE,			/* pc_relative */
   3042 	 0,			/* bitpos */
   3043 	 complain_overflow_signed, /* complain_on_overflow */
   3044 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
   3045 	 "R_MICROMIPS_GPREL7_S2",	/* name */
   3046 	 FALSE,			/* partial_inplace */
   3047 	 0,			/* src_mask */
   3048 	 0x0000007f,		/* dst_mask */
   3049 	 FALSE),		/* pcrel_offset */
   3050 
   3051   HOWTO (R_MICROMIPS_PC23_S2,	/* type */
   3052 	 2,			/* rightshift */
   3053 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   3054 	 23,			/* bitsize */
   3055 	 TRUE,			/* pc_relative */
   3056 	 0,			/* bitpos */
   3057 	 complain_overflow_signed, /* complain_on_overflow */
   3058 	 _bfd_mips_elf_generic_reloc, /* special_function */
   3059 	 "R_MICROMIPS_PC23_S2",	/* name */
   3060 	 FALSE,			/* partial_inplace */
   3061 	 0,			/* src_mask */
   3062 	 0x007fffff,		/* dst_mask */
   3063 	 TRUE),			/* pcrel_offset */
   3064 };
   3065 
   3066 /* GNU extension to record C++ vtable hierarchy */
   3067 static reloc_howto_type elf_mips_gnu_vtinherit_howto =
   3068   HOWTO (R_MIPS_GNU_VTINHERIT,	/* type */
   3069 	 0,			/* rightshift */
   3070 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   3071 	 0,			/* bitsize */
   3072 	 FALSE,			/* pc_relative */
   3073 	 0,			/* bitpos */
   3074 	 complain_overflow_dont, /* complain_on_overflow */
   3075 	 NULL,			/* special_function */
   3076 	 "R_MIPS_GNU_VTINHERIT", /* name */
   3077 	 FALSE,			/* partial_inplace */
   3078 	 0,			/* src_mask */
   3079 	 0,			/* dst_mask */
   3080 	 FALSE);		/* pcrel_offset */
   3081 
   3082 /* GNU extension to record C++ vtable member usage */
   3083 static reloc_howto_type elf_mips_gnu_vtentry_howto =
   3084   HOWTO (R_MIPS_GNU_VTENTRY,	/* type */
   3085 	 0,			/* rightshift */
   3086 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   3087 	 0,			/* bitsize */
   3088 	 FALSE,			/* pc_relative */
   3089 	 0,			/* bitpos */
   3090 	 complain_overflow_dont, /* complain_on_overflow */
   3091 	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
   3092 	 "R_MIPS_GNU_VTENTRY",	/* name */
   3093 	 FALSE,			/* partial_inplace */
   3094 	 0,			/* src_mask */
   3095 	 0,			/* dst_mask */
   3096 	 FALSE);		/* pcrel_offset */
   3097 
   3098 /* 16 bit offset for pc-relative branches.  */
   3100 static reloc_howto_type elf_mips_gnu_rel16_s2 =
   3101   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
   3102 	 2,			/* rightshift */
   3103 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   3104 	 16,			/* bitsize */
   3105 	 TRUE,			/* pc_relative */
   3106 	 0,			/* bitpos */
   3107 	 complain_overflow_signed, /* complain_on_overflow */
   3108 	 _bfd_mips_elf_generic_reloc, /* special_function */
   3109 	 "R_MIPS_GNU_REL16_S2",	/* name */
   3110 	 TRUE,			/* partial_inplace */
   3111 	 0x0000ffff,		/* src_mask */
   3112 	 0x0000ffff,		/* dst_mask */
   3113 	 TRUE);			/* pcrel_offset */
   3114 
   3115 /* 16 bit offset for pc-relative branches.  */
   3116 static reloc_howto_type elf_mips_gnu_rela16_s2 =
   3117   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
   3118 	 2,			/* rightshift */
   3119 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   3120 	 16,			/* bitsize */
   3121 	 TRUE,			/* pc_relative */
   3122 	 0,			/* bitpos */
   3123 	 complain_overflow_signed, /* complain_on_overflow */
   3124 	 _bfd_mips_elf_generic_reloc, /* special_function */
   3125 	 "R_MIPS_GNU_REL16_S2",	/* name */
   3126 	 FALSE,			/* partial_inplace */
   3127 	 0,			/* src_mask */
   3128 	 0x0000ffff,		/* dst_mask */
   3129 	 TRUE);			/* pcrel_offset */
   3130 
   3131 /* 32 bit pc-relative.  Used for compact EH tables.  */
   3132 static reloc_howto_type elf_mips_gnu_pcrel32 =
   3133   HOWTO (R_MIPS_PC32,		/* type */
   3134 	 0,			/* rightshift */
   3135 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   3136 	 32,			/* bitsize */
   3137 	 TRUE,			/* pc_relative */
   3138 	 0,			/* bitpos */
   3139 	 complain_overflow_signed, /* complain_on_overflow */
   3140 	 _bfd_mips_elf_generic_reloc, /* special_function */
   3141 	 "R_MIPS_PC32",		/* name */
   3142 	 TRUE,			/* partial_inplace */
   3143 	 0xffffffff,		/* src_mask */
   3144 	 0xffffffff,		/* dst_mask */
   3145 	 TRUE);			/* pcrel_offset */
   3146 
   3147 
   3148 /* Originally a VxWorks extension, but now used for other systems too.  */
   3150 static reloc_howto_type elf_mips_copy_howto =
   3151   HOWTO (R_MIPS_COPY,		/* type */
   3152 	 0,			/* rightshift */
   3153 	 0,			/* this one is variable size */
   3154 	 0,			/* bitsize */
   3155 	 FALSE,			/* pc_relative */
   3156 	 0,			/* bitpos */
   3157 	 complain_overflow_bitfield, /* complain_on_overflow */
   3158 	 _bfd_mips_elf_generic_reloc, /* special_function */
   3159 	 "R_MIPS_COPY",		/* name */
   3160 	 FALSE,			/* partial_inplace */
   3161 	 0x0,			/* src_mask */
   3162 	 0x0,			/* dst_mask */
   3163 	 FALSE);		/* pcrel_offset */
   3164 
   3165 /* Originally a VxWorks extension, but now used for other systems too.  */
   3166 static reloc_howto_type elf_mips_jump_slot_howto =
   3167   HOWTO (R_MIPS_JUMP_SLOT,	/* type */
   3168 	 0,			/* rightshift */
   3169 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   3170 	 32,			/* bitsize */
   3171 	 FALSE,			/* pc_relative */
   3172 	 0,			/* bitpos */
   3173 	 complain_overflow_bitfield, /* complain_on_overflow */
   3174 	 _bfd_mips_elf_generic_reloc, /* special_function */
   3175 	 "R_MIPS_JUMP_SLOT",	/* name */
   3176 	 FALSE,			/* partial_inplace */
   3177 	 0x0,			/* src_mask */
   3178 	 0x0,			/* dst_mask */
   3179 	 FALSE);		/* pcrel_offset */
   3180 
   3181 /* Used in EH tables.  */
   3182 static reloc_howto_type elf_mips_eh_howto =
   3183   HOWTO (R_MIPS_EH,		/* type */
   3184 	 0,			/* rightshift */
   3185 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   3186 	 32,			/* bitsize */
   3187 	 FALSE,			/* pc_relative */
   3188 	 0,			/* bitpos */
   3189 	 complain_overflow_signed, /* complain_on_overflow */
   3190 	 _bfd_mips_elf_generic_reloc, /* special_function */
   3191 	 "R_MIPS_EH",		/* name */
   3192 	 TRUE,			/* partial_inplace */
   3193 	 0xffffffff,		/* src_mask */
   3194 	 0xffffffff,		/* dst_mask */
   3195 	 FALSE);		/* pcrel_offset */
   3196 
   3197 
   3198 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
   3200    dangerous relocation.  */
   3201 
   3202 static bfd_boolean
   3203 mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
   3204 {
   3205   unsigned int count;
   3206   asymbol **sym;
   3207   unsigned int i;
   3208 
   3209   /* If we've already figured out what GP will be, just return it.  */
   3210   *pgp = _bfd_get_gp_value (output_bfd);
   3211   if (*pgp)
   3212     return TRUE;
   3213 
   3214   count = bfd_get_symcount (output_bfd);
   3215   sym = bfd_get_outsymbols (output_bfd);
   3216 
   3217   /* The linker script will have created a symbol named `_gp' with the
   3218      appropriate value.  */
   3219   if (sym == NULL)
   3220     i = count;
   3221   else
   3222     {
   3223       for (i = 0; i < count; i++, sym++)
   3224 	{
   3225 	  register const char *name;
   3226 
   3227 	  name = bfd_asymbol_name (*sym);
   3228 	  if (*name == '_' && strcmp (name, "_gp") == 0)
   3229 	    {
   3230 	      *pgp = bfd_asymbol_value (*sym);
   3231 	      _bfd_set_gp_value (output_bfd, *pgp);
   3232 	      break;
   3233 	    }
   3234 	}
   3235     }
   3236 
   3237   if (i >= count)
   3238     {
   3239       /* Only get the error once.  */
   3240       *pgp = 4;
   3241       _bfd_set_gp_value (output_bfd, *pgp);
   3242       return FALSE;
   3243     }
   3244 
   3245   return TRUE;
   3246 }
   3247 
   3248 /* We have to figure out the gp value, so that we can adjust the
   3249    symbol value correctly.  We look up the symbol _gp in the output
   3250    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
   3251    target data.  We don't need to adjust the symbol value for an
   3252    external symbol if we are producing relocatable output.  */
   3253 
   3254 static bfd_reloc_status_type
   3255 mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
   3256 		   char **error_message, bfd_vma *pgp)
   3257 {
   3258   if (bfd_is_und_section (symbol->section)
   3259       && ! relocatable)
   3260     {
   3261       *pgp = 0;
   3262       return bfd_reloc_undefined;
   3263     }
   3264 
   3265   *pgp = _bfd_get_gp_value (output_bfd);
   3266   if (*pgp == 0
   3267       && (! relocatable
   3268 	  || (symbol->flags & BSF_SECTION_SYM) != 0))
   3269     {
   3270       if (relocatable)
   3271 	{
   3272 	  /* Make up a value.  */
   3273 	  *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
   3274 	  _bfd_set_gp_value (output_bfd, *pgp);
   3275 	}
   3276       else if (!mips_elf_assign_gp (output_bfd, pgp))
   3277 	{
   3278 	  *error_message =
   3279 	    (char *) _("GP relative relocation when _gp not defined");
   3280 	  return bfd_reloc_dangerous;
   3281 	}
   3282     }
   3283 
   3284   return bfd_reloc_ok;
   3285 }
   3286 
   3287 /* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
   3288    become the offset from the gp register.  */
   3289 
   3290 static bfd_reloc_status_type
   3291 mips_elf_gprel16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
   3292 			asymbol *symbol, void *data ATTRIBUTE_UNUSED,
   3293 			asection *input_section, bfd *output_bfd,
   3294 			char **error_message ATTRIBUTE_UNUSED)
   3295 {
   3296   bfd_boolean relocatable;
   3297   bfd_reloc_status_type ret;
   3298   bfd_vma gp;
   3299 
   3300   if (output_bfd != NULL)
   3301     relocatable = TRUE;
   3302   else
   3303     {
   3304       relocatable = FALSE;
   3305       output_bfd = symbol->section->output_section->owner;
   3306     }
   3307 
   3308   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
   3309 			   &gp);
   3310   if (ret != bfd_reloc_ok)
   3311     return ret;
   3312 
   3313   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   3314 					input_section, relocatable,
   3315 					data, gp);
   3316 }
   3317 
   3318 /* Do a R_MIPS_LITERAL relocation.  */
   3319 
   3320 static bfd_reloc_status_type
   3321 mips_elf_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   3322 			void *data, asection *input_section, bfd *output_bfd,
   3323 			char **error_message)
   3324 {
   3325   bfd_boolean relocatable;
   3326   bfd_reloc_status_type ret;
   3327   bfd_vma gp;
   3328 
   3329   /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
   3330   if (output_bfd != NULL
   3331       && (symbol->flags & BSF_SECTION_SYM) == 0
   3332       && (symbol->flags & BSF_LOCAL) != 0)
   3333     {
   3334       *error_message = (char *)
   3335 	_("literal relocation occurs for an external symbol");
   3336       return bfd_reloc_outofrange;
   3337     }
   3338 
   3339   /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
   3340   if (output_bfd != NULL)
   3341     relocatable = TRUE;
   3342   else
   3343     {
   3344       relocatable = FALSE;
   3345       output_bfd = symbol->section->output_section->owner;
   3346     }
   3347 
   3348   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
   3349 			   &gp);
   3350   if (ret != bfd_reloc_ok)
   3351     return ret;
   3352 
   3353   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   3354 					input_section, relocatable,
   3355 					data, gp);
   3356 }
   3357 
   3358 /* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
   3359    become the offset from the gp register.  */
   3360 
   3361 static bfd_reloc_status_type
   3362 mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   3363 			void *data, asection *input_section, bfd *output_bfd,
   3364 			char **error_message)
   3365 {
   3366   bfd_boolean relocatable;
   3367   bfd_reloc_status_type ret;
   3368   bfd_vma gp;
   3369 
   3370   /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
   3371   if (output_bfd != NULL
   3372       && (symbol->flags & BSF_SECTION_SYM) == 0
   3373       && (symbol->flags & BSF_LOCAL) != 0)
   3374     {
   3375       *error_message = (char *)
   3376 	_("32bits gp relative relocation occurs for an external symbol");
   3377       return bfd_reloc_outofrange;
   3378     }
   3379 
   3380   if (output_bfd != NULL)
   3381     {
   3382       relocatable = TRUE;
   3383       gp = _bfd_get_gp_value (output_bfd);
   3384     }
   3385   else
   3386     {
   3387       relocatable = FALSE;
   3388       output_bfd = symbol->section->output_section->owner;
   3389 
   3390       ret = mips_elf_final_gp (output_bfd, symbol, relocatable,
   3391 			       error_message, &gp);
   3392       if (ret != bfd_reloc_ok)
   3393 	return ret;
   3394     }
   3395 
   3396   return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
   3397 			  relocatable, data, gp);
   3398 }
   3399 
   3400 static bfd_reloc_status_type
   3401 gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry,
   3402 		 asection *input_section, bfd_boolean relocatable,
   3403 		 void *data, bfd_vma gp)
   3404 {
   3405   bfd_vma relocation;
   3406   unsigned long val;
   3407 
   3408   if (bfd_is_com_section (symbol->section))
   3409     relocation = 0;
   3410   else
   3411     relocation = symbol->value;
   3412 
   3413   relocation += symbol->section->output_section->vma;
   3414   relocation += symbol->section->output_offset;
   3415 
   3416   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
   3417     return bfd_reloc_outofrange;
   3418 
   3419   if (reloc_entry->howto->src_mask == 0)
   3420     val = 0;
   3421   else
   3422     val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
   3423 
   3424   /* Set val to the offset into the section or symbol.  */
   3425   val += reloc_entry->addend;
   3426 
   3427   /* Adjust val for the final section location and GP value.  If we
   3428      are producing relocatable output, we don't want to do this for
   3429      an external symbol.  */
   3430   if (! relocatable
   3431       || (symbol->flags & BSF_SECTION_SYM) != 0)
   3432     val += relocation - gp;
   3433 
   3434   bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
   3435 
   3436   if (relocatable)
   3437     reloc_entry->address += input_section->output_offset;
   3438 
   3439   return bfd_reloc_ok;
   3440 }
   3441 
   3442 /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
   3443    the rest is at bits 6-10. The bitpos already got right by the howto.  */
   3444 
   3445 static bfd_reloc_status_type
   3446 mips_elf_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   3447 		       void *data, asection *input_section, bfd *output_bfd,
   3448 		       char **error_message)
   3449 {
   3450   if (reloc_entry->howto->partial_inplace)
   3451     {
   3452       reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
   3453 			     | (reloc_entry->addend & 0x00000800) >> 9);
   3454     }
   3455 
   3456   return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
   3457 				      input_section, output_bfd,
   3458 				      error_message);
   3459 }
   3460 
   3461 /* Handle a mips16 GP relative reloc.  */
   3463 
   3464 static bfd_reloc_status_type
   3465 mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   3466 		    void *data, asection *input_section, bfd *output_bfd,
   3467 		    char **error_message)
   3468 {
   3469   bfd_boolean relocatable;
   3470   bfd_reloc_status_type ret;
   3471   bfd_byte *location;
   3472   bfd_vma gp;
   3473 
   3474   /* If we're relocating, and this is an external symbol, we don't want
   3475      to change anything.  */
   3476   if (output_bfd != NULL
   3477       && (symbol->flags & BSF_SECTION_SYM) == 0
   3478       && (symbol->flags & BSF_LOCAL) != 0)
   3479     {
   3480       reloc_entry->address += input_section->output_offset;
   3481       return bfd_reloc_ok;
   3482     }
   3483 
   3484   if (output_bfd != NULL)
   3485     relocatable = TRUE;
   3486   else
   3487     {
   3488       relocatable = FALSE;
   3489       output_bfd = symbol->section->output_section->owner;
   3490     }
   3491 
   3492   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
   3493 			   &gp);
   3494   if (ret != bfd_reloc_ok)
   3495     return ret;
   3496 
   3497   location = (bfd_byte *) data + reloc_entry->address;
   3498   _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
   3499 				 location);
   3500   ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   3501 				       input_section, relocatable,
   3502 				       data, gp);
   3503   _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
   3504 			       location);
   3505 
   3506   return ret;
   3507 }
   3508 
   3509 /* A mapping from BFD reloc types to MIPS ELF reloc types.  */
   3511 
   3512 struct elf_reloc_map {
   3513   bfd_reloc_code_real_type bfd_val;
   3514   enum elf_mips_reloc_type elf_val;
   3515 };
   3516 
   3517 static const struct elf_reloc_map mips_reloc_map[] =
   3518 {
   3519   { BFD_RELOC_NONE, R_MIPS_NONE },
   3520   { BFD_RELOC_16, R_MIPS_16 },
   3521   { BFD_RELOC_32, R_MIPS_32 },
   3522   /* There is no BFD reloc for R_MIPS_REL32.  */
   3523   { BFD_RELOC_CTOR, R_MIPS_32 },
   3524   { BFD_RELOC_64, R_MIPS_64 },
   3525   { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
   3526   { BFD_RELOC_HI16_S, R_MIPS_HI16 },
   3527   { BFD_RELOC_LO16, R_MIPS_LO16 },
   3528   { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
   3529   { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
   3530   { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
   3531   { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
   3532   { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
   3533   { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
   3534   { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
   3535   { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
   3536   { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
   3537   { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
   3538   { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
   3539   { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
   3540   { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
   3541   { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
   3542   { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
   3543   { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
   3544   { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
   3545   { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
   3546   { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
   3547   { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
   3548   { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
   3549   { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
   3550   { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
   3551   /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
   3552   { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
   3553   { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
   3554   { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
   3555   { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
   3556   { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
   3557   { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
   3558   { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
   3559   { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
   3560   { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
   3561   { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
   3562   { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
   3563   { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
   3564   { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
   3565   { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
   3566   { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 },
   3567   { BFD_RELOC_MIPS_21_PCREL_S2, R_MIPS_PC21_S2 },
   3568   { BFD_RELOC_MIPS_26_PCREL_S2, R_MIPS_PC26_S2 },
   3569   { BFD_RELOC_MIPS_18_PCREL_S3, R_MIPS_PC18_S3 },
   3570   { BFD_RELOC_MIPS_19_PCREL_S2, R_MIPS_PC19_S2 },
   3571   { BFD_RELOC_HI16_S_PCREL, R_MIPS_PCHI16 },
   3572   { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 }
   3573 };
   3574 
   3575 static const struct elf_reloc_map mips16_reloc_map[] =
   3576 {
   3577   { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
   3578   { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
   3579   { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
   3580   { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
   3581   { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
   3582   { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
   3583   { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
   3584   { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
   3585   { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
   3586     R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
   3587   { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
   3588     R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
   3589   { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
   3590   { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
   3591   { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min },
   3592   { BFD_RELOC_MIPS16_16_PCREL_S1, R_MIPS16_PC16_S1 - R_MIPS16_min }
   3593 };
   3594 
   3595 static const struct elf_reloc_map micromips_reloc_map[] =
   3596 {
   3597   { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min },
   3598   { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min },
   3599   { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min },
   3600   { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min },
   3601   { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min },
   3602   { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min },
   3603   { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min },
   3604   { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min },
   3605   { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min },
   3606   { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min },
   3607   { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min },
   3608   { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min },
   3609   { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min },
   3610   { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min },
   3611   { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min },
   3612   { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min },
   3613   { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min },
   3614   { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min },
   3615   { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min },
   3616   { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
   3617   { BFD_RELOC_MICROMIPS_SCN_DISP, R_MICROMIPS_SCN_DISP - R_MICROMIPS_min },
   3618   { BFD_RELOC_MICROMIPS_JALR, R_MICROMIPS_JALR - R_MICROMIPS_min },
   3619   /* There is no BFD reloc for R_MICROMIPS_HI0_LO16.  */
   3620   { BFD_RELOC_MICROMIPS_TLS_GD, R_MICROMIPS_TLS_GD - R_MICROMIPS_min },
   3621   { BFD_RELOC_MICROMIPS_TLS_LDM, R_MICROMIPS_TLS_LDM - R_MICROMIPS_min },
   3622   { BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16,
   3623     R_MICROMIPS_TLS_DTPREL_HI16 - R_MICROMIPS_min },
   3624   { BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16,
   3625     R_MICROMIPS_TLS_DTPREL_LO16 - R_MICROMIPS_min },
   3626   { BFD_RELOC_MICROMIPS_TLS_GOTTPREL,
   3627     R_MICROMIPS_TLS_GOTTPREL - R_MICROMIPS_min },
   3628   { BFD_RELOC_MICROMIPS_TLS_TPREL_HI16,
   3629     R_MICROMIPS_TLS_TPREL_HI16 - R_MICROMIPS_min },
   3630   { BFD_RELOC_MICROMIPS_TLS_TPREL_LO16,
   3631     R_MICROMIPS_TLS_TPREL_LO16 - R_MICROMIPS_min },
   3632   /* There is no BFD reloc for R_MICROMIPS_GPREL7_S2.  */
   3633   /* There is no BFD reloc for R_MICROMIPS_PC23_S2.  */
   3634 };
   3635 
   3636 /* Given a BFD reloc type, return a howto structure.  */
   3637 
   3638 static reloc_howto_type *
   3639 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   3640 				 bfd_reloc_code_real_type code)
   3641 {
   3642   unsigned int i;
   3643   /* FIXME: We default to RELA here instead of choosing the right
   3644      relocation variant.  */
   3645   reloc_howto_type *howto_table = elf_mips_howto_table_rela;
   3646   reloc_howto_type *howto16_table = elf_mips16_howto_table_rela;
   3647   reloc_howto_type *howto_micromips_table = elf_micromips_howto_table_rela;
   3648 
   3649   for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
   3650        i++)
   3651     {
   3652       if (mips_reloc_map[i].bfd_val == code)
   3653 	return &howto_table[(int) mips_reloc_map[i].elf_val];
   3654     }
   3655 
   3656   for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
   3657        i++)
   3658     {
   3659       if (mips16_reloc_map[i].bfd_val == code)
   3660 	return &howto16_table[(int) mips16_reloc_map[i].elf_val];
   3661     }
   3662 
   3663   for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map);
   3664        i++)
   3665     {
   3666       if (micromips_reloc_map[i].bfd_val == code)
   3667 	return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val];
   3668     }
   3669 
   3670   switch (code)
   3671     {
   3672     case BFD_RELOC_VTABLE_INHERIT:
   3673       return &elf_mips_gnu_vtinherit_howto;
   3674     case BFD_RELOC_VTABLE_ENTRY:
   3675       return &elf_mips_gnu_vtentry_howto;
   3676     case BFD_RELOC_32_PCREL:
   3677       return &elf_mips_gnu_pcrel32;
   3678     case BFD_RELOC_MIPS_EH:
   3679       return &elf_mips_eh_howto;
   3680     case BFD_RELOC_MIPS_COPY:
   3681       return &elf_mips_copy_howto;
   3682     case BFD_RELOC_MIPS_JUMP_SLOT:
   3683       return &elf_mips_jump_slot_howto;
   3684     default:
   3685       bfd_set_error (bfd_error_bad_value);
   3686       return NULL;
   3687     }
   3688 }
   3689 
   3690 static reloc_howto_type *
   3691 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   3692 				 const char *r_name)
   3693 {
   3694   unsigned int i;
   3695 
   3696   for (i = 0;
   3697        i < (sizeof (elf_mips_howto_table_rela)
   3698 	    / sizeof (elf_mips_howto_table_rela[0]));
   3699        i++)
   3700     if (elf_mips_howto_table_rela[i].name != NULL
   3701 	&& strcasecmp (elf_mips_howto_table_rela[i].name, r_name) == 0)
   3702       return &elf_mips_howto_table_rela[i];
   3703 
   3704   for (i = 0;
   3705        i < (sizeof (elf_mips16_howto_table_rela)
   3706 	    / sizeof (elf_mips16_howto_table_rela[0]));
   3707        i++)
   3708     if (elf_mips16_howto_table_rela[i].name != NULL
   3709 	&& strcasecmp (elf_mips16_howto_table_rela[i].name, r_name) == 0)
   3710       return &elf_mips16_howto_table_rela[i];
   3711 
   3712   for (i = 0;
   3713        i < (sizeof (elf_micromips_howto_table_rela)
   3714 	    / sizeof (elf_micromips_howto_table_rela[0]));
   3715        i++)
   3716     if (elf_micromips_howto_table_rela[i].name != NULL
   3717 	&& strcasecmp (elf_micromips_howto_table_rela[i].name, r_name) == 0)
   3718       return &elf_micromips_howto_table_rela[i];
   3719 
   3720   if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
   3721     return &elf_mips_gnu_vtinherit_howto;
   3722   if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
   3723     return &elf_mips_gnu_vtentry_howto;
   3724   if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
   3725     return &elf_mips_gnu_rel16_s2;
   3726   if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
   3727     return &elf_mips_gnu_rela16_s2;
   3728   if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0)
   3729     return &elf_mips_gnu_pcrel32;
   3730   if (strcasecmp (elf_mips_eh_howto.name, r_name) == 0)
   3731     return &elf_mips_eh_howto;
   3732   if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
   3733     return &elf_mips_copy_howto;
   3734   if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
   3735     return &elf_mips_jump_slot_howto;
   3736 
   3737   return NULL;
   3738 }
   3739 
   3740 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
   3741 
   3742 static reloc_howto_type *
   3743 mips_elf_n32_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p)
   3744 {
   3745   reloc_howto_type *howto = NULL;
   3746 
   3747   switch (r_type)
   3748     {
   3749     case R_MIPS_GNU_VTINHERIT:
   3750       return &elf_mips_gnu_vtinherit_howto;
   3751     case R_MIPS_GNU_VTENTRY:
   3752       return &elf_mips_gnu_vtentry_howto;
   3753     case R_MIPS_GNU_REL16_S2:
   3754       if (rela_p)
   3755 	return &elf_mips_gnu_rela16_s2;
   3756       else
   3757 	return &elf_mips_gnu_rel16_s2;
   3758     case R_MIPS_PC32:
   3759       return &elf_mips_gnu_pcrel32;
   3760     case R_MIPS_EH:
   3761       return &elf_mips_eh_howto;
   3762     case R_MIPS_COPY:
   3763       return &elf_mips_copy_howto;
   3764     case R_MIPS_JUMP_SLOT:
   3765       return &elf_mips_jump_slot_howto;
   3766     default:
   3767       if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
   3768 	{
   3769 	  if (rela_p)
   3770 	    howto = &elf_micromips_howto_table_rela[r_type - R_MICROMIPS_min];
   3771 	  else
   3772 	    howto = &elf_micromips_howto_table_rel[r_type - R_MICROMIPS_min];
   3773 	}
   3774       if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
   3775 	{
   3776 	  if (rela_p)
   3777 	    howto = &elf_mips16_howto_table_rela[r_type - R_MIPS16_min];
   3778 	  else
   3779 	    howto = &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
   3780 	}
   3781       if (r_type < R_MIPS_max)
   3782 	{
   3783 	  if (rela_p)
   3784 	    howto = &elf_mips_howto_table_rela[r_type];
   3785 	  else
   3786 	    howto = &elf_mips_howto_table_rel[r_type];
   3787 	}
   3788       if (howto != NULL && howto->name != NULL)
   3789 	return howto;
   3790 
   3791       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
   3792 			  abfd, r_type);
   3793       bfd_set_error (bfd_error_bad_value);
   3794       return NULL;
   3795     }
   3796 }
   3797 
   3798 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
   3799 
   3800 static bfd_boolean
   3801 mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
   3802 {
   3803   unsigned int r_type;
   3804 
   3805   r_type = ELF32_R_TYPE (dst->r_info);
   3806   cache_ptr->howto = mips_elf_n32_rtype_to_howto (abfd, r_type, FALSE);
   3807 
   3808   if (cache_ptr->howto == NULL)
   3809     return FALSE;
   3810 
   3811   /* The addend for a GPREL16 or LITERAL relocation comes from the GP
   3812      value for the object file.  We get the addend now, rather than
   3813      when we do the relocation, because the symbol manipulations done
   3814      by the linker may cause us to lose track of the input BFD.  */
   3815   if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
   3816       && (gprel16_reloc_p (r_type) || r_type == (unsigned int) R_MIPS_LITERAL))
   3817     cache_ptr->addend = elf_gp (abfd);
   3818 
   3819   return TRUE;
   3820 }
   3821 
   3822 /* Given a MIPS Elf_Internal_Rela, fill in an arelent structure.  */
   3823 
   3824 static bfd_boolean
   3825 mips_info_to_howto_rela (bfd *abfd,
   3826 			 arelent *cache_ptr, Elf_Internal_Rela *dst)
   3827 {
   3828   unsigned int r_type;
   3829 
   3830   r_type = ELF32_R_TYPE (dst->r_info);
   3831   cache_ptr->howto = mips_elf_n32_rtype_to_howto (abfd, r_type, TRUE);
   3832   cache_ptr->addend = dst->r_addend;
   3833   return cache_ptr->howto != NULL;
   3834 }
   3835 
   3836 /* Determine whether a symbol is global for the purposes of splitting
   3838    the symbol table into global symbols and local symbols.  At least
   3839    on Irix 5, this split must be between section symbols and all other
   3840    symbols.  On most ELF targets the split is between static symbols
   3841    and externally visible symbols.  */
   3842 
   3843 static bfd_boolean
   3844 mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
   3845 {
   3846   if (SGI_COMPAT (abfd))
   3847     return (sym->flags & BSF_SECTION_SYM) == 0;
   3848   else
   3849     return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
   3850 	    || bfd_is_und_section (bfd_get_section (sym))
   3851 	    || bfd_is_com_section (bfd_get_section (sym)));
   3852 }
   3853 
   3854 /* Set the right machine number for a MIPS ELF file.  */
   3856 
   3857 static bfd_boolean
   3858 mips_elf_n32_object_p (bfd *abfd)
   3859 {
   3860   unsigned long mach;
   3861 
   3862   if (!ABI_N32_P (abfd))
   3863     return FALSE;
   3864 
   3865   /* Irix 5 and 6 are broken.  Object file symbol tables are not always
   3866      sorted correctly such that local symbols precede global symbols,
   3867      and the sh_info field in the symbol table is not always right.  */
   3868   if (SGI_COMPAT (abfd))
   3869     elf_bad_symtab (abfd) = TRUE;
   3870 
   3871   mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
   3872   bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
   3873   return TRUE;
   3874 }
   3875 
   3876 /* Support for core dump NOTE sections.  */
   3878 static bfd_boolean
   3879 elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
   3880 {
   3881   int offset;
   3882   unsigned int size;
   3883 
   3884   switch (note->descsz)
   3885     {
   3886       default:
   3887 	return FALSE;
   3888 
   3889       case 440:		/* Linux/MIPS N32 */
   3890 	/* pr_cursig */
   3891 	elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
   3892 
   3893 	/* pr_pid */
   3894 	elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
   3895 
   3896 	/* pr_reg */
   3897 	offset = 72;
   3898 	size = 360;
   3899 
   3900 	break;
   3901     }
   3902 
   3903   /* Make a ".reg/999" section.  */
   3904   return _bfd_elfcore_make_pseudosection (abfd, ".reg", size,
   3905 					  note->descpos + offset);
   3906 }
   3907 
   3908 static bfd_boolean
   3909 elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
   3910 {
   3911   switch (note->descsz)
   3912     {
   3913       default:
   3914 	return FALSE;
   3915 
   3916       case 128:		/* Linux/MIPS elf_prpsinfo */
   3917 	elf_tdata (abfd)->core->pid
   3918 	 = bfd_get_32 (abfd, note->descdata + 16);
   3919 	elf_tdata (abfd)->core->program
   3920 	 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
   3921 	elf_tdata (abfd)->core->command
   3922 	 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
   3923     }
   3924 
   3925   /* Note that for some reason, a spurious space is tacked
   3926      onto the end of the args in some (at least one anyway)
   3927      implementations, so strip it off if it exists.  */
   3928 
   3929   {
   3930     char *command = elf_tdata (abfd)->core->command;
   3931     int n = strlen (command);
   3932 
   3933     if (0 < n && command[n - 1] == ' ')
   3934       command[n - 1] = '\0';
   3935   }
   3936 
   3937   return TRUE;
   3938 }
   3939 
   3940 static bfd_boolean
   3941 elf_n32_mips_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note)
   3942 {
   3943   size_t offset;
   3944   size_t size;
   3945   size_t min_size;
   3946 
   3947   /* Compute offset of pr_getregsz, skipping over pr_statussz.
   3948      Also compute minimum size of this note.  */
   3949   offset = 4 + 4;
   3950   min_size = offset + 4 * 2 + 4 + 4 + 4;
   3951 
   3952   if (note->descsz < min_size)
   3953     return FALSE;
   3954 
   3955   /* Check for version 1 in pr_version.  */
   3956   if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
   3957     return FALSE;
   3958 
   3959   /* Extract size of pr_reg from pr_gregsetsz.  */
   3960   /* Skip over pr_gregsetsz and pr_fpregsetsz.  */
   3961   size = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
   3962   offset += 4 * 2;
   3963 
   3964   /* Skip over pr_osreldate.  */
   3965   offset += 4;
   3966 
   3967   /* Read signal from pr_cursig.  */
   3968   if (elf_tdata (abfd)->core->signal == 0)
   3969     elf_tdata (abfd)->core->signal
   3970       = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
   3971   offset += 4;
   3972 
   3973   /* Read TID from pr_pid.  */
   3974   elf_tdata (abfd)->core->lwpid
   3975       = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
   3976   offset += 4;
   3977 
   3978   /* Padding before pr_reg.  */
   3979   offset += 4;
   3980 
   3981   /* Make sure that there is enough data remaining in the note.  */
   3982   if (note->descsz - offset < size)
   3983     return FALSE;
   3984 
   3985   /* Make a ".reg/999" section and a ".reg" section.  */
   3986   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
   3987 					  size, note->descpos + offset);
   3988 }
   3989 
   3990 /* Write Linux core PRSTATUS note into core file.  */
   3991 
   3992 static char *
   3993 elf32_mips_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
   3994 			     ...)
   3995 {
   3996   switch (note_type)
   3997     {
   3998     default:
   3999       return NULL;
   4000 
   4001     case NT_PRPSINFO:
   4002       BFD_FAIL ();
   4003       return NULL;
   4004 
   4005     case NT_PRSTATUS:
   4006       {
   4007 	char data[440];
   4008 	va_list ap;
   4009 	long pid;
   4010 	int cursig;
   4011 	const void *greg;
   4012 
   4013 	va_start (ap, note_type);
   4014 	memset (data, 0, 72);
   4015 	pid = va_arg (ap, long);
   4016 	bfd_put_32 (abfd, pid, data + 24);
   4017 	cursig = va_arg (ap, int);
   4018 	bfd_put_16 (abfd, cursig, data + 12);
   4019 	greg = va_arg (ap, const void *);
   4020 	memcpy (data + 72, greg, 360);
   4021 	memset (data + 432, 0, 8);
   4022 	va_end (ap);
   4023 	return elfcore_write_note (abfd, buf, bufsiz,
   4024 				   "CORE", note_type, data, sizeof (data));
   4025       }
   4026     }
   4027 }
   4028 
   4029 /* Depending on the target vector we generate some version of Irix
   4031    executables or "normal" MIPS ELF ABI executables.  */
   4032 static irix_compat_t
   4033 elf_n32_mips_irix_compat (bfd *abfd)
   4034 {
   4035   if ((abfd->xvec == &mips_elf32_n_be_vec)
   4036       || (abfd->xvec == &mips_elf32_n_le_vec))
   4037     return ict_irix6;
   4038   else
   4039     return ict_none;
   4040 }
   4041 
   4042 /* Make an n32 MIPS object.  We need to set the n32 ABI flag in
   4044    `e_flags' to tell the object apart from an o32 object.  */
   4045 
   4046 static bfd_boolean
   4047 mips_elf_n32_mkobject (bfd *abfd)
   4048 {
   4049   bfd_boolean ret;
   4050 
   4051   ret = _bfd_mips_elf_mkobject (abfd);
   4052   if (ret)
   4053     elf_elfheader (abfd)->e_flags |= EF_MIPS_ABI2;
   4054 
   4055   return ret;
   4056 }
   4057 
   4058 /* ECOFF swapping routines.  These are used when dealing with the
   4060    .mdebug section, which is in the ECOFF debugging format.  */
   4061 static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
   4062   /* Symbol table magic number.  */
   4063   magicSym,
   4064   /* Alignment of debugging information.  E.g., 4.  */
   4065   4,
   4066   /* Sizes of external symbolic information.  */
   4067   sizeof (struct hdr_ext),
   4068   sizeof (struct dnr_ext),
   4069   sizeof (struct pdr_ext),
   4070   sizeof (struct sym_ext),
   4071   sizeof (struct opt_ext),
   4072   sizeof (struct fdr_ext),
   4073   sizeof (struct rfd_ext),
   4074   sizeof (struct ext_ext),
   4075   /* Functions to swap in external symbolic data.  */
   4076   ecoff_swap_hdr_in,
   4077   ecoff_swap_dnr_in,
   4078   ecoff_swap_pdr_in,
   4079   ecoff_swap_sym_in,
   4080   ecoff_swap_opt_in,
   4081   ecoff_swap_fdr_in,
   4082   ecoff_swap_rfd_in,
   4083   ecoff_swap_ext_in,
   4084   _bfd_ecoff_swap_tir_in,
   4085   _bfd_ecoff_swap_rndx_in,
   4086   /* Functions to swap out external symbolic data.  */
   4087   ecoff_swap_hdr_out,
   4088   ecoff_swap_dnr_out,
   4089   ecoff_swap_pdr_out,
   4090   ecoff_swap_sym_out,
   4091   ecoff_swap_opt_out,
   4092   ecoff_swap_fdr_out,
   4093   ecoff_swap_rfd_out,
   4094   ecoff_swap_ext_out,
   4095   _bfd_ecoff_swap_tir_out,
   4096   _bfd_ecoff_swap_rndx_out,
   4097   /* Function to read in symbolic data.  */
   4098   _bfd_mips_elf_read_ecoff_info
   4099 };
   4100 
   4101 #define ELF_ARCH			bfd_arch_mips
   4103 #define ELF_TARGET_ID			MIPS_ELF_DATA
   4104 #define ELF_MACHINE_CODE		EM_MIPS
   4105 
   4106 #define elf_backend_collect		TRUE
   4107 #define elf_backend_type_change_ok	TRUE
   4108 #define elf_backend_can_gc_sections	TRUE
   4109 #define elf_backend_gc_mark_extra_sections \
   4110 					_bfd_mips_elf_gc_mark_extra_sections
   4111 #define elf_info_to_howto		mips_info_to_howto_rela
   4112 #define elf_info_to_howto_rel		mips_info_to_howto_rel
   4113 #define elf_backend_sym_is_global	mips_elf_sym_is_global
   4114 #define elf_backend_object_p		mips_elf_n32_object_p
   4115 #define elf_backend_symbol_processing	_bfd_mips_elf_symbol_processing
   4116 #define elf_backend_section_processing	_bfd_mips_elf_section_processing
   4117 #define elf_backend_section_from_shdr	_bfd_mips_elf_section_from_shdr
   4118 #define elf_backend_fake_sections	_bfd_mips_elf_fake_sections
   4119 #define elf_backend_section_from_bfd_section \
   4120 					_bfd_mips_elf_section_from_bfd_section
   4121 #define elf_backend_add_symbol_hook	_bfd_mips_elf_add_symbol_hook
   4122 #define elf_backend_link_output_symbol_hook \
   4123 					_bfd_mips_elf_link_output_symbol_hook
   4124 #define elf_backend_create_dynamic_sections \
   4125 					_bfd_mips_elf_create_dynamic_sections
   4126 #define elf_backend_check_relocs	_bfd_mips_elf_check_relocs
   4127 #define elf_backend_merge_symbol_attribute \
   4128 					_bfd_mips_elf_merge_symbol_attribute
   4129 #define elf_backend_get_target_dtag	_bfd_mips_elf_get_target_dtag
   4130 #define elf_backend_adjust_dynamic_symbol \
   4131 					_bfd_mips_elf_adjust_dynamic_symbol
   4132 #define elf_backend_always_size_sections \
   4133 					_bfd_mips_elf_always_size_sections
   4134 #define elf_backend_size_dynamic_sections \
   4135 					_bfd_mips_elf_size_dynamic_sections
   4136 #define elf_backend_init_index_section	_bfd_elf_init_1_index_section
   4137 #define elf_backend_relocate_section	_bfd_mips_elf_relocate_section
   4138 #define elf_backend_finish_dynamic_symbol \
   4139 					_bfd_mips_elf_finish_dynamic_symbol
   4140 #define elf_backend_finish_dynamic_sections \
   4141 					_bfd_mips_elf_finish_dynamic_sections
   4142 #define elf_backend_final_write_processing \
   4143 					_bfd_mips_elf_final_write_processing
   4144 #define elf_backend_additional_program_headers \
   4145 					_bfd_mips_elf_additional_program_headers
   4146 #define elf_backend_modify_segment_map	_bfd_mips_elf_modify_segment_map
   4147 #define elf_backend_gc_mark_hook	_bfd_mips_elf_gc_mark_hook
   4148 #define elf_backend_gc_sweep_hook	_bfd_mips_elf_gc_sweep_hook
   4149 #define elf_backend_copy_indirect_symbol \
   4150 					_bfd_mips_elf_copy_indirect_symbol
   4151 #define elf_backend_hide_symbol		_bfd_mips_elf_hide_symbol
   4152 #define elf_backend_grok_prstatus	elf32_mips_grok_prstatus
   4153 #define elf_backend_grok_psinfo		elf32_mips_grok_psinfo
   4154 #define elf_backend_grok_freebsd_prstatus \
   4155 					elf_n32_mips_grok_freebsd_prstatus
   4156 #define elf_backend_ecoff_debug_swap	&mips_elf32_ecoff_debug_swap
   4157 
   4158 #define elf_backend_got_header_size	(4 * MIPS_RESERVED_GOTNO)
   4159 #define elf_backend_want_dynrelro	1
   4160 
   4161 /* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations
   4162    work better/work only in RELA, so we default to this.  */
   4163 #define elf_backend_may_use_rel_p	1
   4164 #define elf_backend_may_use_rela_p	1
   4165 #define elf_backend_default_use_rela_p	1
   4166 #define elf_backend_rela_plts_and_copies_p 0
   4167 #define elf_backend_sign_extend_vma	TRUE
   4168 #define elf_backend_plt_readonly	1
   4169 #define elf_backend_plt_sym_val		_bfd_mips_elf_plt_sym_val
   4170 
   4171 #define elf_backend_discard_info	_bfd_mips_elf_discard_info
   4172 #define elf_backend_ignore_discarded_relocs \
   4173 					_bfd_mips_elf_ignore_discarded_relocs
   4174 #define elf_backend_write_section	_bfd_mips_elf_write_section
   4175 #define elf_backend_mips_irix_compat	elf_n32_mips_irix_compat
   4176 #define elf_backend_mips_rtype_to_howto	mips_elf_n32_rtype_to_howto
   4177 #define bfd_elf32_bfd_is_target_special_symbol \
   4178 					_bfd_mips_elf_is_target_special_symbol
   4179 #define bfd_elf32_find_nearest_line	_bfd_mips_elf_find_nearest_line
   4180 #define bfd_elf32_find_inliner_info	_bfd_mips_elf_find_inliner_info
   4181 #define bfd_elf32_new_section_hook	_bfd_mips_elf_new_section_hook
   4182 #define bfd_elf32_set_section_contents	_bfd_mips_elf_set_section_contents
   4183 #define bfd_elf32_bfd_get_relocated_section_contents \
   4184 				_bfd_elf_mips_get_relocated_section_contents
   4185 #define bfd_elf32_bfd_link_hash_table_create \
   4186 					_bfd_mips_elf_link_hash_table_create
   4187 #define bfd_elf32_bfd_final_link	_bfd_mips_elf_final_link
   4188 #define bfd_elf32_bfd_merge_private_bfd_data \
   4189 					_bfd_mips_elf_merge_private_bfd_data
   4190 #define bfd_elf32_bfd_set_private_flags	_bfd_mips_elf_set_private_flags
   4191 #define bfd_elf32_bfd_print_private_bfd_data \
   4192 					_bfd_mips_elf_print_private_bfd_data
   4193 #define bfd_elf32_mkobject		mips_elf_n32_mkobject
   4194 
   4195 /* Support for SGI-ish mips targets using n32 ABI.  */
   4196 
   4197 #define TARGET_LITTLE_SYM		mips_elf32_n_le_vec
   4198 #define TARGET_LITTLE_NAME		"elf32-nlittlemips"
   4199 #define TARGET_BIG_SYM			mips_elf32_n_be_vec
   4200 #define TARGET_BIG_NAME			"elf32-nbigmips"
   4201 
   4202 #define ELF_MAXPAGESIZE			0x10000
   4203 #define ELF_COMMONPAGESIZE		0x1000
   4204 
   4205 #include "elf32-target.h"
   4206 
   4207 /* Support for traditional mips targets using n32 ABI.  */
   4208 #undef TARGET_LITTLE_SYM
   4209 #undef TARGET_LITTLE_NAME
   4210 #undef TARGET_BIG_SYM
   4211 #undef TARGET_BIG_NAME
   4212 
   4213 #undef ELF_MAXPAGESIZE
   4214 #undef ELF_COMMONPAGESIZE
   4215 
   4216 #define TARGET_LITTLE_SYM		mips_elf32_ntrad_le_vec
   4217 #define TARGET_LITTLE_NAME		"elf32-ntradlittlemips"
   4218 #define TARGET_BIG_SYM			mips_elf32_ntrad_be_vec
   4219 #define TARGET_BIG_NAME			"elf32-ntradbigmips"
   4220 
   4221 #define ELF_MAXPAGESIZE			0x10000
   4222 #define ELF_COMMONPAGESIZE		0x1000
   4223 #define elf32_bed			elf32_tradbed
   4224 
   4225 #undef elf_backend_write_core_note
   4226 #define elf_backend_write_core_note	elf32_mips_write_core_note
   4227 
   4228 /* Include the target file again for this target.  */
   4229 #include "elf32-target.h"
   4230 
   4231 
   4232 /* FreeBSD support.  */
   4233 
   4234 #undef TARGET_LITTLE_SYM
   4235 #undef TARGET_LITTLE_NAME
   4236 #undef TARGET_BIG_SYM
   4237 #undef TARGET_BIG_NAME
   4238 
   4239 #define	TARGET_LITTLE_SYM		mips_elf32_ntradfbsd_le_vec
   4240 #define	TARGET_LITTLE_NAME		"elf32-ntradlittlemips-freebsd"
   4241 #define	TARGET_BIG_SYM			mips_elf32_ntradfbsd_be_vec
   4242 #define	TARGET_BIG_NAME			"elf32-ntradbigmips-freebsd"
   4243 
   4244 #undef	ELF_OSABI
   4245 #define	ELF_OSABI			ELFOSABI_FREEBSD
   4246 
   4247 #undef	elf32_bed
   4248 #define elf32_bed				elf32_fbsd_tradbed
   4249 
   4250 #undef elf_backend_write_core_note
   4251 
   4252 #include "elf32-target.h"
   4253