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