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