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