Home | History | Annotate | Line # | Download | only in bfd
elfn32-mips.c revision 1.1.1.1
      1 /* MIPS-specific support for 32-bit ELF
      2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
      3    2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
      4 
      5    Most of the information added by Ian Lance Taylor, Cygnus Support,
      6    <ian (at) cygnus.com>.
      7    N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
      8    <mark (at) codesourcery.com>
      9    Traditional MIPS targets support added by Koundinya.K, Dansk Data
     10    Elektronik & Operations Research Group. <kk (at) ddeorg.soft.net>
     11 
     12    This file is part of BFD, the Binary File Descriptor library.
     13 
     14    This program is free software; you can redistribute it and/or modify
     15    it under the terms of the GNU General Public License as published by
     16    the Free Software Foundation; either version 3 of the License, or
     17    (at your option) any later version.
     18 
     19    This program is distributed in the hope that it will be useful,
     20    but WITHOUT ANY WARRANTY; without even the implied warranty of
     21    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     22    GNU General Public License for more details.
     23 
     24    You should have received a copy of the GNU General Public License
     25    along with this program; if not, write to the Free Software
     26    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     27    MA 02110-1301, USA.  */
     28 
     29 
     30 /* This file handles MIPS ELF targets.  SGI Irix 5 uses a slightly
     31    different MIPS ELF from other targets.  This matters when linking.
     32    This file supports both, switching at runtime.  */
     33 
     34 #include "sysdep.h"
     35 #include "bfd.h"
     36 #include "libbfd.h"
     37 #include "bfdlink.h"
     38 #include "genlink.h"
     39 #include "elf-bfd.h"
     40 #include "elfxx-mips.h"
     41 #include "elf/mips.h"
     42 
     43 /* Get the ECOFF swapping routines.  */
     44 #include "coff/sym.h"
     45 #include "coff/symconst.h"
     46 #include "coff/internal.h"
     47 #include "coff/ecoff.h"
     48 #include "coff/mips.h"
     49 #define ECOFF_SIGNED_32
     50 #include "ecoffswap.h"
     51 
     52 static bfd_boolean mips_elf_assign_gp
     53   (bfd *, bfd_vma *);
     54 static bfd_reloc_status_type mips_elf_final_gp
     55   (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
     56 static bfd_reloc_status_type mips_elf_gprel16_reloc
     57   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     58 static bfd_reloc_status_type mips_elf_literal_reloc
     59   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     60 static bfd_reloc_status_type mips_elf_gprel32_reloc
     61   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     62 static bfd_reloc_status_type gprel32_with_gp
     63   (bfd *, asymbol *, arelent *, asection *, bfd_boolean, void *, bfd_vma);
     64 static bfd_reloc_status_type mips_elf_shift6_reloc
     65   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     66 static bfd_reloc_status_type mips16_gprel_reloc
     67   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
     68 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
     69   (bfd *, bfd_reloc_code_real_type);
     70 static reloc_howto_type *mips_elf_n32_rtype_to_howto
     71   (unsigned int, bfd_boolean);
     72 static void mips_info_to_howto_rel
     73   (bfd *, arelent *, Elf_Internal_Rela *);
     74 static void mips_info_to_howto_rela
     75   (bfd *, arelent *, Elf_Internal_Rela *);
     76 static bfd_boolean mips_elf_sym_is_global
     77   (bfd *, asymbol *);
     78 static bfd_boolean mips_elf_n32_object_p
     79   (bfd *);
     80 static bfd_boolean elf32_mips_grok_prstatus
     81   (bfd *, Elf_Internal_Note *);
     82 static bfd_boolean elf32_mips_grok_psinfo
     83   (bfd *, Elf_Internal_Note *);
     84 static irix_compat_t elf_n32_mips_irix_compat
     85   (bfd *);
     86 
     87 extern const bfd_target bfd_elf32_nbigmips_vec;
     88 extern const bfd_target bfd_elf32_nlittlemips_vec;
     89 
     90 /* Nonzero if ABFD is using the N32 ABI.  */
     91 #define ABI_N32_P(abfd) \
     92   ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
     93 
     94 /* Whether we are trying to be compatible with IRIX at all.  */
     95 #define SGI_COMPAT(abfd) \
     96   (elf_n32_mips_irix_compat (abfd) != ict_none)
     97 
     98 /* The number of local .got entries we reserve.  */
     99 #define MIPS_RESERVED_GOTNO (2)
    100 
    101 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
    102    from smaller values.  Start with zero, widen, *then* decrement.  */
    103 #define MINUS_ONE	(((bfd_vma)0) - 1)
    104 
    105 /* The relocation table used for SHT_REL sections.  */
    106 
    107 static reloc_howto_type elf_mips_howto_table_rel[] =
    108 {
    109   /* No relocation.  */
    110   HOWTO (R_MIPS_NONE,		/* type */
    111 	 0,			/* rightshift */
    112 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    113 	 0,			/* bitsize */
    114 	 FALSE,			/* pc_relative */
    115 	 0,			/* bitpos */
    116 	 complain_overflow_dont, /* complain_on_overflow */
    117 	 _bfd_mips_elf_generic_reloc, /* special_function */
    118 	 "R_MIPS_NONE",		/* name */
    119 	 FALSE,			/* partial_inplace */
    120 	 0,			/* src_mask */
    121 	 0,			/* dst_mask */
    122 	 FALSE),		/* pcrel_offset */
    123 
    124   /* 16 bit relocation.  */
    125   HOWTO (R_MIPS_16,		/* type */
    126 	 0,			/* rightshift */
    127 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    128 	 16,			/* bitsize */
    129 	 FALSE,			/* pc_relative */
    130 	 0,			/* bitpos */
    131 	 complain_overflow_signed, /* complain_on_overflow */
    132 	 _bfd_mips_elf_generic_reloc, /* special_function */
    133 	 "R_MIPS_16",		/* name */
    134 	 TRUE,			/* partial_inplace */
    135 	 0x0000ffff,		/* src_mask */
    136 	 0x0000ffff,		/* dst_mask */
    137 	 FALSE),		/* pcrel_offset */
    138 
    139   /* 32 bit relocation.  */
    140   HOWTO (R_MIPS_32,		/* type */
    141 	 0,			/* rightshift */
    142 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    143 	 32,			/* bitsize */
    144 	 FALSE,			/* pc_relative */
    145 	 0,			/* bitpos */
    146 	 complain_overflow_dont, /* complain_on_overflow */
    147 	 _bfd_mips_elf_generic_reloc, /* special_function */
    148 	 "R_MIPS_32",		/* name */
    149 	 TRUE,			/* partial_inplace */
    150 	 0xffffffff,		/* src_mask */
    151 	 0xffffffff,		/* dst_mask */
    152 	 FALSE),		/* pcrel_offset */
    153 
    154   /* 32 bit symbol relative relocation.  */
    155   HOWTO (R_MIPS_REL32,		/* type */
    156 	 0,			/* rightshift */
    157 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    158 	 32,			/* bitsize */
    159 	 FALSE,			/* pc_relative */
    160 	 0,			/* bitpos */
    161 	 complain_overflow_dont, /* complain_on_overflow */
    162 	 _bfd_mips_elf_generic_reloc, /* special_function */
    163 	 "R_MIPS_REL32",	/* name */
    164 	 TRUE,			/* partial_inplace */
    165 	 0xffffffff,		/* src_mask */
    166 	 0xffffffff,		/* dst_mask */
    167 	 FALSE),		/* pcrel_offset */
    168 
    169   /* 26 bit jump address.  */
    170   HOWTO (R_MIPS_26,		/* type */
    171 	 2,			/* rightshift */
    172 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    173 	 26,			/* bitsize */
    174 	 FALSE,			/* pc_relative */
    175 	 0,			/* bitpos */
    176 	 complain_overflow_dont, /* complain_on_overflow */
    177 	 			/* This needs complex overflow
    178 				   detection, because the upper four
    179 				   bits must match the PC + 4.  */
    180 	 _bfd_mips_elf_generic_reloc, /* special_function */
    181 	 "R_MIPS_26",		/* name */
    182 	 TRUE,			/* partial_inplace */
    183 	 0x03ffffff,		/* src_mask */
    184 	 0x03ffffff,		/* dst_mask */
    185 	 FALSE),		/* pcrel_offset */
    186 
    187   /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
    188      However, the native IRIX6 tools use them, so we try our best. */
    189 
    190   /* High 16 bits of symbol value.  */
    191   HOWTO (R_MIPS_HI16,		/* type */
    192 	 16,			/* rightshift */
    193 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    194 	 16,			/* bitsize */
    195 	 FALSE,			/* pc_relative */
    196 	 0,			/* bitpos */
    197 	 complain_overflow_dont, /* complain_on_overflow */
    198 	 _bfd_mips_elf_hi16_reloc, /* special_function */
    199 	 "R_MIPS_HI16",		/* name */
    200 	 TRUE,			/* partial_inplace */
    201 	 0x0000ffff,		/* src_mask */
    202 	 0x0000ffff,		/* dst_mask */
    203 	 FALSE),		/* pcrel_offset */
    204 
    205   /* Low 16 bits of symbol value.  */
    206   HOWTO (R_MIPS_LO16,		/* type */
    207 	 0,			/* rightshift */
    208 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    209 	 16,			/* bitsize */
    210 	 FALSE,			/* pc_relative */
    211 	 0,			/* bitpos */
    212 	 complain_overflow_dont, /* complain_on_overflow */
    213 	 _bfd_mips_elf_lo16_reloc, /* special_function */
    214 	 "R_MIPS_LO16",		/* name */
    215 	 TRUE,			/* partial_inplace */
    216 	 0x0000ffff,		/* src_mask */
    217 	 0x0000ffff,		/* dst_mask */
    218 	 FALSE),		/* pcrel_offset */
    219 
    220   /* GP relative reference.  */
    221   HOWTO (R_MIPS_GPREL16,	/* type */
    222 	 0,			/* rightshift */
    223 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    224 	 16,			/* bitsize */
    225 	 FALSE,			/* pc_relative */
    226 	 0,			/* bitpos */
    227 	 complain_overflow_signed, /* complain_on_overflow */
    228 	 mips_elf_gprel16_reloc, /* special_function */
    229 	 "R_MIPS_GPREL16",	/* name */
    230 	 TRUE,			/* partial_inplace */
    231 	 0x0000ffff,		/* src_mask */
    232 	 0x0000ffff,		/* dst_mask */
    233 	 FALSE),		/* pcrel_offset */
    234 
    235   /* Reference to literal section.  */
    236   HOWTO (R_MIPS_LITERAL,	/* type */
    237 	 0,			/* rightshift */
    238 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    239 	 16,			/* bitsize */
    240 	 FALSE,			/* pc_relative */
    241 	 0,			/* bitpos */
    242 	 complain_overflow_signed, /* complain_on_overflow */
    243 	 mips_elf_literal_reloc, /* special_function */
    244 	 "R_MIPS_LITERAL",	/* name */
    245 	 TRUE,			/* partial_inplace */
    246 	 0x0000ffff,		/* src_mask */
    247 	 0x0000ffff,		/* dst_mask */
    248 	 FALSE),		/* pcrel_offset */
    249 
    250   /* Reference to global offset table.  */
    251   HOWTO (R_MIPS_GOT16,		/* type */
    252 	 0,			/* rightshift */
    253 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    254 	 16,			/* bitsize */
    255 	 FALSE,			/* pc_relative */
    256 	 0,			/* bitpos */
    257 	 complain_overflow_signed, /* complain_on_overflow */
    258 	 _bfd_mips_elf_got16_reloc, /* special_function */
    259 	 "R_MIPS_GOT16",	/* name */
    260 	 TRUE,			/* partial_inplace */
    261 	 0x0000ffff,		/* src_mask */
    262 	 0x0000ffff,		/* dst_mask */
    263 	 FALSE),		/* pcrel_offset */
    264 
    265   /* 16 bit PC relative reference.  Note that the ABI document has a typo
    266      and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
    267      We do the right thing here.  */
    268   HOWTO (R_MIPS_PC16,		/* type */
    269 	 2,			/* rightshift */
    270 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    271 	 16,			/* bitsize */
    272 	 TRUE,			/* pc_relative */
    273 	 0,			/* bitpos */
    274 	 complain_overflow_signed, /* complain_on_overflow */
    275 	 _bfd_mips_elf_generic_reloc, /* special_function */
    276 	 "R_MIPS_PC16",		/* name */
    277 	 TRUE,			/* partial_inplace */
    278 	 0x0000ffff,		/* src_mask */
    279 	 0x0000ffff,		/* dst_mask */
    280 	 TRUE),			/* pcrel_offset */
    281 
    282   /* 16 bit call through global offset table.  */
    283   HOWTO (R_MIPS_CALL16,		/* type */
    284 	 0,			/* rightshift */
    285 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    286 	 16,			/* bitsize */
    287 	 FALSE,			/* pc_relative */
    288 	 0,			/* bitpos */
    289 	 complain_overflow_signed, /* complain_on_overflow */
    290 	 _bfd_mips_elf_generic_reloc, /* special_function */
    291 	 "R_MIPS_CALL16",	/* name */
    292 	 TRUE,			/* partial_inplace */
    293 	 0x0000ffff,		/* src_mask */
    294 	 0x0000ffff,		/* dst_mask */
    295 	 FALSE),		/* pcrel_offset */
    296 
    297   /* 32 bit GP relative reference.  */
    298   HOWTO (R_MIPS_GPREL32,	/* type */
    299 	 0,			/* rightshift */
    300 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    301 	 32,			/* bitsize */
    302 	 FALSE,			/* pc_relative */
    303 	 0,			/* bitpos */
    304 	 complain_overflow_dont, /* complain_on_overflow */
    305 	 mips_elf_gprel32_reloc, /* special_function */
    306 	 "R_MIPS_GPREL32",	/* name */
    307 	 TRUE,			/* partial_inplace */
    308 	 0xffffffff,		/* src_mask */
    309 	 0xffffffff,		/* dst_mask */
    310 	 FALSE),		/* pcrel_offset */
    311 
    312   /* The remaining relocs are defined on Irix 5, although they are
    313      not defined by the ABI.  */
    314   EMPTY_HOWTO (13),
    315   EMPTY_HOWTO (14),
    316   EMPTY_HOWTO (15),
    317 
    318   /* A 5 bit shift field.  */
    319   HOWTO (R_MIPS_SHIFT5,		/* type */
    320 	 0,			/* rightshift */
    321 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    322 	 5,			/* bitsize */
    323 	 FALSE,			/* pc_relative */
    324 	 6,			/* bitpos */
    325 	 complain_overflow_bitfield, /* complain_on_overflow */
    326 	 _bfd_mips_elf_generic_reloc, /* special_function */
    327 	 "R_MIPS_SHIFT5",	/* name */
    328 	 TRUE,			/* partial_inplace */
    329 	 0x000007c0,		/* src_mask */
    330 	 0x000007c0,		/* dst_mask */
    331 	 FALSE),		/* pcrel_offset */
    332 
    333   /* A 6 bit shift field.  */
    334   HOWTO (R_MIPS_SHIFT6,		/* type */
    335 	 0,			/* rightshift */
    336 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    337 	 6,			/* bitsize */
    338 	 FALSE,			/* pc_relative */
    339 	 6,			/* bitpos */
    340 	 complain_overflow_bitfield, /* complain_on_overflow */
    341 	 mips_elf_shift6_reloc,	/* special_function */
    342 	 "R_MIPS_SHIFT6",	/* name */
    343 	 TRUE,			/* partial_inplace */
    344 	 0x000007c4,		/* src_mask */
    345 	 0x000007c4,		/* dst_mask */
    346 	 FALSE),		/* pcrel_offset */
    347 
    348   /* A 64 bit relocation.  */
    349   HOWTO (R_MIPS_64,		/* type */
    350 	 0,			/* rightshift */
    351 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    352 	 64,			/* bitsize */
    353 	 FALSE,			/* pc_relative */
    354 	 0,			/* bitpos */
    355 	 complain_overflow_dont, /* complain_on_overflow */
    356 	 _bfd_mips_elf_generic_reloc, /* special_function */
    357 	 "R_MIPS_64",		/* name */
    358 	 TRUE,			/* partial_inplace */
    359 	 MINUS_ONE,		/* src_mask */
    360 	 MINUS_ONE,		/* dst_mask */
    361 	 FALSE),		/* pcrel_offset */
    362 
    363   /* Displacement in the global offset table.  */
    364   HOWTO (R_MIPS_GOT_DISP,	/* type */
    365 	 0,			/* rightshift */
    366 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    367 	 16,			/* bitsize */
    368 	 FALSE,			/* pc_relative */
    369 	 0,			/* bitpos */
    370 	 complain_overflow_signed, /* complain_on_overflow */
    371 	 _bfd_mips_elf_generic_reloc, /* special_function */
    372 	 "R_MIPS_GOT_DISP",	/* name */
    373 	 TRUE,			/* partial_inplace */
    374 	 0x0000ffff,		/* src_mask */
    375 	 0x0000ffff,		/* dst_mask */
    376 	 FALSE),		/* pcrel_offset */
    377 
    378   /* Displacement to page pointer in the global offset table.  */
    379   HOWTO (R_MIPS_GOT_PAGE,	/* type */
    380 	 0,			/* rightshift */
    381 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    382 	 16,			/* bitsize */
    383 	 FALSE,			/* pc_relative */
    384 	 0,			/* bitpos */
    385 	 complain_overflow_signed, /* complain_on_overflow */
    386 	 _bfd_mips_elf_generic_reloc, /* special_function */
    387 	 "R_MIPS_GOT_PAGE",	/* name */
    388 	 TRUE,			/* partial_inplace */
    389 	 0x0000ffff,		/* src_mask */
    390 	 0x0000ffff,		/* dst_mask */
    391 	 FALSE),		/* pcrel_offset */
    392 
    393   /* Offset from page pointer in the global offset table.  */
    394   HOWTO (R_MIPS_GOT_OFST,	/* type */
    395 	 0,			/* rightshift */
    396 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    397 	 16,			/* bitsize */
    398 	 FALSE,			/* pc_relative */
    399 	 0,			/* bitpos */
    400 	 complain_overflow_signed, /* complain_on_overflow */
    401 	 _bfd_mips_elf_generic_reloc, /* special_function */
    402 	 "R_MIPS_GOT_OFST",	/* name */
    403 	 TRUE,			/* partial_inplace */
    404 	 0x0000ffff,		/* src_mask */
    405 	 0x0000ffff,		/* dst_mask */
    406 	 FALSE),		/* pcrel_offset */
    407 
    408   /* High 16 bits of displacement in global offset table.  */
    409   HOWTO (R_MIPS_GOT_HI16,	/* type */
    410 	 0,			/* rightshift */
    411 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    412 	 16,			/* bitsize */
    413 	 FALSE,			/* pc_relative */
    414 	 0,			/* bitpos */
    415 	 complain_overflow_dont, /* complain_on_overflow */
    416 	 _bfd_mips_elf_generic_reloc, /* special_function */
    417 	 "R_MIPS_GOT_HI16",	/* name */
    418 	 TRUE,			/* partial_inplace */
    419 	 0x0000ffff,		/* src_mask */
    420 	 0x0000ffff,		/* dst_mask */
    421 	 FALSE),		/* pcrel_offset */
    422 
    423   /* Low 16 bits of displacement in global offset table.  */
    424   HOWTO (R_MIPS_GOT_LO16,	/* type */
    425 	 0,			/* rightshift */
    426 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    427 	 16,			/* bitsize */
    428 	 FALSE,			/* pc_relative */
    429 	 0,			/* bitpos */
    430 	 complain_overflow_dont, /* complain_on_overflow */
    431 	 _bfd_mips_elf_generic_reloc, /* special_function */
    432 	 "R_MIPS_GOT_LO16",	/* name */
    433 	 TRUE,			/* partial_inplace */
    434 	 0x0000ffff,		/* src_mask */
    435 	 0x0000ffff,		/* dst_mask */
    436 	 FALSE),		/* pcrel_offset */
    437 
    438   /* 64 bit subtraction.  */
    439   HOWTO (R_MIPS_SUB,		/* type */
    440 	 0,			/* rightshift */
    441 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    442 	 64,			/* bitsize */
    443 	 FALSE,			/* pc_relative */
    444 	 0,			/* bitpos */
    445 	 complain_overflow_dont, /* complain_on_overflow */
    446 	 _bfd_mips_elf_generic_reloc, /* special_function */
    447 	 "R_MIPS_SUB",		/* name */
    448 	 TRUE,			/* partial_inplace */
    449 	 MINUS_ONE,		/* src_mask */
    450 	 MINUS_ONE,		/* dst_mask */
    451 	 FALSE),		/* pcrel_offset */
    452 
    453   /* Insert the addend as an instruction.  */
    454   /* FIXME: Not handled correctly.  */
    455   HOWTO (R_MIPS_INSERT_A,	/* type */
    456 	 0,			/* rightshift */
    457 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    458 	 32,			/* bitsize */
    459 	 FALSE,			/* pc_relative */
    460 	 0,			/* bitpos */
    461 	 complain_overflow_dont, /* complain_on_overflow */
    462 	 _bfd_mips_elf_generic_reloc, /* special_function */
    463 	 "R_MIPS_INSERT_A",	/* name */
    464 	 TRUE,			/* partial_inplace */
    465 	 0xffffffff,		/* src_mask */
    466 	 0xffffffff,		/* dst_mask */
    467 	 FALSE),		/* pcrel_offset */
    468 
    469   /* Insert the addend as an instruction, and change all relocations
    470      to refer to the old instruction at the address.  */
    471   /* FIXME: Not handled correctly.  */
    472   HOWTO (R_MIPS_INSERT_B,	/* type */
    473 	 0,			/* rightshift */
    474 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    475 	 32,			/* bitsize */
    476 	 FALSE,			/* pc_relative */
    477 	 0,			/* bitpos */
    478 	 complain_overflow_dont, /* complain_on_overflow */
    479 	 _bfd_mips_elf_generic_reloc, /* special_function */
    480 	 "R_MIPS_INSERT_B",	/* name */
    481 	 TRUE,			/* partial_inplace */
    482 	 0xffffffff,		/* src_mask */
    483 	 0xffffffff,		/* dst_mask */
    484 	 FALSE),		/* pcrel_offset */
    485 
    486   /* Delete a 32 bit instruction.  */
    487   /* FIXME: Not handled correctly.  */
    488   HOWTO (R_MIPS_DELETE,		/* type */
    489 	 0,			/* rightshift */
    490 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    491 	 32,			/* bitsize */
    492 	 FALSE,			/* pc_relative */
    493 	 0,			/* bitpos */
    494 	 complain_overflow_dont, /* complain_on_overflow */
    495 	 _bfd_mips_elf_generic_reloc, /* special_function */
    496 	 "R_MIPS_DELETE",	/* name */
    497 	 TRUE,			/* partial_inplace */
    498 	 0xffffffff,		/* src_mask */
    499 	 0xffffffff,		/* dst_mask */
    500 	 FALSE),		/* pcrel_offset */
    501 
    502   /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
    503      We don't, because
    504        a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
    505 	  R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
    506 	  fallable heuristics.
    507        b) No other NewABI toolchain actually emits such relocations.  */
    508   EMPTY_HOWTO (R_MIPS_HIGHER),
    509   EMPTY_HOWTO (R_MIPS_HIGHEST),
    510 
    511   /* High 16 bits of displacement in global offset table.  */
    512   HOWTO (R_MIPS_CALL_HI16,	/* type */
    513 	 0,			/* rightshift */
    514 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    515 	 16,			/* bitsize */
    516 	 FALSE,			/* pc_relative */
    517 	 0,			/* bitpos */
    518 	 complain_overflow_dont, /* complain_on_overflow */
    519 	 _bfd_mips_elf_generic_reloc, /* special_function */
    520 	 "R_MIPS_CALL_HI16",	/* name */
    521 	 TRUE,			/* partial_inplace */
    522 	 0x0000ffff,		/* src_mask */
    523 	 0x0000ffff,		/* dst_mask */
    524 	 FALSE),		/* pcrel_offset */
    525 
    526   /* Low 16 bits of displacement in global offset table.  */
    527   HOWTO (R_MIPS_CALL_LO16,	/* type */
    528 	 0,			/* rightshift */
    529 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    530 	 16,			/* bitsize */
    531 	 FALSE,			/* pc_relative */
    532 	 0,			/* bitpos */
    533 	 complain_overflow_dont, /* complain_on_overflow */
    534 	 _bfd_mips_elf_generic_reloc, /* special_function */
    535 	 "R_MIPS_CALL_LO16",	/* name */
    536 	 TRUE,			/* partial_inplace */
    537 	 0x0000ffff,		/* src_mask */
    538 	 0x0000ffff,		/* dst_mask */
    539 	 FALSE),		/* pcrel_offset */
    540 
    541   /* Section displacement.  */
    542   HOWTO (R_MIPS_SCN_DISP,       /* type */
    543 	 0,			/* rightshift */
    544 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    545 	 32,			/* bitsize */
    546 	 FALSE,			/* pc_relative */
    547 	 0,			/* bitpos */
    548 	 complain_overflow_dont, /* complain_on_overflow */
    549 	 _bfd_mips_elf_generic_reloc, /* special_function */
    550 	 "R_MIPS_SCN_DISP",     /* name */
    551 	 TRUE,			/* partial_inplace */
    552 	 0xffffffff,		/* src_mask */
    553 	 0xffffffff,		/* dst_mask */
    554 	 FALSE),		/* pcrel_offset */
    555 
    556   HOWTO (R_MIPS_REL16,		/* type */
    557 	 0,			/* rightshift */
    558 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    559 	 16,			/* bitsize */
    560 	 FALSE,			/* pc_relative */
    561 	 0,			/* bitpos */
    562 	 complain_overflow_signed, /* complain_on_overflow */
    563 	 _bfd_mips_elf_generic_reloc, /* special_function */
    564 	 "R_MIPS_REL16",	/* name */
    565 	 TRUE,			/* partial_inplace */
    566 	 0xffff,		/* src_mask */
    567 	 0xffff,		/* dst_mask */
    568 	 FALSE),		/* pcrel_offset */
    569 
    570   /* These two are obsolete.  */
    571   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
    572   EMPTY_HOWTO (R_MIPS_PJUMP),
    573 
    574   /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
    575      It must be used for multigot GOT's (and only there).  */
    576   HOWTO (R_MIPS_RELGOT,		/* type */
    577 	 0,			/* rightshift */
    578 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    579 	 32,			/* bitsize */
    580 	 FALSE,			/* pc_relative */
    581 	 0,			/* bitpos */
    582 	 complain_overflow_dont, /* complain_on_overflow */
    583 	 _bfd_mips_elf_generic_reloc, /* special_function */
    584 	 "R_MIPS_RELGOT",	/* name */
    585 	 TRUE,			/* partial_inplace */
    586 	 0xffffffff,		/* src_mask */
    587 	 0xffffffff,		/* dst_mask */
    588 	 FALSE),		/* pcrel_offset */
    589 
    590   /* Protected jump conversion.  This is an optimization hint.  No
    591      relocation is required for correctness.  */
    592   HOWTO (R_MIPS_JALR,	        /* type */
    593 	 0,			/* rightshift */
    594 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    595 	 32,			/* bitsize */
    596 	 FALSE,			/* pc_relative */
    597 	 0,			/* bitpos */
    598 	 complain_overflow_dont, /* complain_on_overflow */
    599 	 _bfd_mips_elf_generic_reloc, /* special_function */
    600 	 "R_MIPS_JALR",	        /* name */
    601 	 FALSE,			/* partial_inplace */
    602 	 0x00000000,		/* src_mask */
    603 	 0x00000000,		/* dst_mask */
    604 	 FALSE),		/* pcrel_offset */
    605 
    606   /* TLS GD/LD dynamic relocations.  */
    607   HOWTO (R_MIPS_TLS_DTPMOD32,	/* type */
    608 	 0,			/* rightshift */
    609 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    610 	 32,			/* bitsize */
    611 	 FALSE,			/* pc_relative */
    612 	 0,			/* bitpos */
    613 	 complain_overflow_dont, /* complain_on_overflow */
    614 	 _bfd_mips_elf_generic_reloc, /* special_function */
    615 	 "R_MIPS_TLS_DTPMOD32",	/* name */
    616 	 TRUE,			/* partial_inplace */
    617 	 0xffffffff,		/* src_mask */
    618 	 0xffffffff,		/* dst_mask */
    619 	 FALSE),		/* pcrel_offset */
    620 
    621   HOWTO (R_MIPS_TLS_DTPREL32,	/* type */
    622 	 0,			/* rightshift */
    623 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    624 	 32,			/* bitsize */
    625 	 FALSE,			/* pc_relative */
    626 	 0,			/* bitpos */
    627 	 complain_overflow_dont, /* complain_on_overflow */
    628 	 _bfd_mips_elf_generic_reloc, /* special_function */
    629 	 "R_MIPS_TLS_DTPREL32",	/* name */
    630 	 TRUE,			/* partial_inplace */
    631 	 0xffffffff,		/* src_mask */
    632 	 0xffffffff,		/* dst_mask */
    633 	 FALSE),		/* pcrel_offset */
    634 
    635   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
    636   EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
    637 
    638   /* TLS general dynamic variable reference.  */
    639   HOWTO (R_MIPS_TLS_GD,		/* type */
    640 	 0,			/* rightshift */
    641 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    642 	 16,			/* bitsize */
    643 	 FALSE,			/* pc_relative */
    644 	 0,			/* bitpos */
    645 	 complain_overflow_signed, /* complain_on_overflow */
    646 	 _bfd_mips_elf_generic_reloc, /* special_function */
    647 	 "R_MIPS_TLS_GD",	/* name */
    648 	 TRUE,			/* partial_inplace */
    649 	 0x0000ffff,		/* src_mask */
    650 	 0x0000ffff,		/* dst_mask */
    651 	 FALSE),		/* pcrel_offset */
    652 
    653   /* TLS local dynamic variable reference.  */
    654   HOWTO (R_MIPS_TLS_LDM,	/* type */
    655 	 0,			/* rightshift */
    656 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    657 	 16,			/* bitsize */
    658 	 FALSE,			/* pc_relative */
    659 	 0,			/* bitpos */
    660 	 complain_overflow_signed, /* complain_on_overflow */
    661 	 _bfd_mips_elf_generic_reloc, /* special_function */
    662 	 "R_MIPS_TLS_LDM",	/* name */
    663 	 TRUE,			/* partial_inplace */
    664 	 0x0000ffff,		/* src_mask */
    665 	 0x0000ffff,		/* dst_mask */
    666 	 FALSE),		/* pcrel_offset */
    667 
    668   /* TLS local dynamic offset.  */
    669   HOWTO (R_MIPS_TLS_DTPREL_HI16,	/* type */
    670 	 0,			/* rightshift */
    671 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    672 	 16,			/* bitsize */
    673 	 FALSE,			/* pc_relative */
    674 	 0,			/* bitpos */
    675 	 complain_overflow_signed, /* complain_on_overflow */
    676 	 _bfd_mips_elf_generic_reloc, /* special_function */
    677 	 "R_MIPS_TLS_DTPREL_HI16",	/* name */
    678 	 TRUE,			/* partial_inplace */
    679 	 0x0000ffff,		/* src_mask */
    680 	 0x0000ffff,		/* dst_mask */
    681 	 FALSE),		/* pcrel_offset */
    682 
    683   /* TLS local dynamic offset.  */
    684   HOWTO (R_MIPS_TLS_DTPREL_LO16,	/* type */
    685 	 0,			/* rightshift */
    686 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    687 	 16,			/* bitsize */
    688 	 FALSE,			/* pc_relative */
    689 	 0,			/* bitpos */
    690 	 complain_overflow_signed, /* complain_on_overflow */
    691 	 _bfd_mips_elf_generic_reloc, /* special_function */
    692 	 "R_MIPS_TLS_DTPREL_LO16",	/* name */
    693 	 TRUE,			/* partial_inplace */
    694 	 0x0000ffff,		/* src_mask */
    695 	 0x0000ffff,		/* dst_mask */
    696 	 FALSE),		/* pcrel_offset */
    697 
    698   /* TLS thread pointer offset.  */
    699   HOWTO (R_MIPS_TLS_GOTTPREL,	/* type */
    700 	 0,			/* rightshift */
    701 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    702 	 16,			/* bitsize */
    703 	 FALSE,			/* pc_relative */
    704 	 0,			/* bitpos */
    705 	 complain_overflow_signed, /* complain_on_overflow */
    706 	 _bfd_mips_elf_generic_reloc, /* special_function */
    707 	 "R_MIPS_TLS_GOTTPREL",	/* name */
    708 	 TRUE,			/* partial_inplace */
    709 	 0x0000ffff,		/* src_mask */
    710 	 0x0000ffff,		/* dst_mask */
    711 	 FALSE),		/* pcrel_offset */
    712 
    713   /* TLS IE dynamic relocations.  */
    714   HOWTO (R_MIPS_TLS_TPREL32,	/* type */
    715 	 0,			/* rightshift */
    716 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    717 	 32,			/* bitsize */
    718 	 FALSE,			/* pc_relative */
    719 	 0,			/* bitpos */
    720 	 complain_overflow_dont, /* complain_on_overflow */
    721 	 _bfd_mips_elf_generic_reloc, /* special_function */
    722 	 "R_MIPS_TLS_TPREL32",	/* name */
    723 	 TRUE,			/* partial_inplace */
    724 	 0xffffffff,		/* src_mask */
    725 	 0xffffffff,		/* dst_mask */
    726 	 FALSE),		/* pcrel_offset */
    727 
    728   EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
    729 
    730   /* TLS thread pointer offset.  */
    731   HOWTO (R_MIPS_TLS_TPREL_HI16,	/* type */
    732 	 0,			/* rightshift */
    733 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    734 	 16,			/* bitsize */
    735 	 FALSE,			/* pc_relative */
    736 	 0,			/* bitpos */
    737 	 complain_overflow_signed, /* complain_on_overflow */
    738 	 _bfd_mips_elf_generic_reloc, /* special_function */
    739 	 "R_MIPS_TLS_TPREL_HI16", /* name */
    740 	 TRUE,			/* partial_inplace */
    741 	 0x0000ffff,		/* src_mask */
    742 	 0x0000ffff,		/* dst_mask */
    743 	 FALSE),		/* pcrel_offset */
    744 
    745   /* TLS thread pointer offset.  */
    746   HOWTO (R_MIPS_TLS_TPREL_LO16,	/* type */
    747 	 0,			/* rightshift */
    748 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    749 	 16,			/* bitsize */
    750 	 FALSE,			/* pc_relative */
    751 	 0,			/* bitpos */
    752 	 complain_overflow_signed, /* complain_on_overflow */
    753 	 _bfd_mips_elf_generic_reloc, /* special_function */
    754 	 "R_MIPS_TLS_TPREL_LO16", /* name */
    755 	 TRUE,			/* partial_inplace */
    756 	 0x0000ffff,		/* src_mask */
    757 	 0x0000ffff,		/* dst_mask */
    758 	 FALSE),		/* pcrel_offset */
    759 
    760   /* 32 bit relocation with no addend.  */
    761   HOWTO (R_MIPS_GLOB_DAT,	/* type */
    762 	 0,			/* rightshift */
    763 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    764 	 32,			/* bitsize */
    765 	 FALSE,			/* pc_relative */
    766 	 0,			/* bitpos */
    767 	 complain_overflow_dont, /* complain_on_overflow */
    768 	 _bfd_mips_elf_generic_reloc, /* special_function */
    769 	 "R_MIPS_GLOB_DAT",	/* name */
    770 	 FALSE,			/* partial_inplace */
    771 	 0x0,			/* src_mask */
    772 	 0xffffffff,		/* dst_mask */
    773 	 FALSE),		/* pcrel_offset */
    774 };
    775 
    776 /* The relocation table used for SHT_RELA sections.  */
    777 
    778 static reloc_howto_type elf_mips_howto_table_rela[] =
    779 {
    780   /* No relocation.  */
    781   HOWTO (R_MIPS_NONE,		/* type */
    782 	 0,			/* rightshift */
    783 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    784 	 0,			/* bitsize */
    785 	 FALSE,			/* pc_relative */
    786 	 0,			/* bitpos */
    787 	 complain_overflow_dont, /* complain_on_overflow */
    788 	 _bfd_mips_elf_generic_reloc, /* special_function */
    789 	 "R_MIPS_NONE",		/* name */
    790 	 FALSE,			/* partial_inplace */
    791 	 0,			/* src_mask */
    792 	 0,			/* dst_mask */
    793 	 FALSE),		/* pcrel_offset */
    794 
    795   /* 16 bit relocation.  */
    796   HOWTO (R_MIPS_16,		/* type */
    797 	 0,			/* rightshift */
    798 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    799 	 16,			/* bitsize */
    800 	 FALSE,			/* pc_relative */
    801 	 0,			/* bitpos */
    802 	 complain_overflow_signed, /* complain_on_overflow */
    803 	 _bfd_mips_elf_generic_reloc, /* special_function */
    804 	 "R_MIPS_16",		/* name */
    805 	 FALSE,			/* partial_inplace */
    806 	 0,			/* src_mask */
    807 	 0x0000,		/* dst_mask */
    808 	 FALSE),		/* pcrel_offset */
    809 
    810   /* 32 bit relocation.  */
    811   HOWTO (R_MIPS_32,		/* type */
    812 	 0,			/* rightshift */
    813 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    814 	 32,			/* bitsize */
    815 	 FALSE,			/* pc_relative */
    816 	 0,			/* bitpos */
    817 	 complain_overflow_dont, /* complain_on_overflow */
    818 	 _bfd_mips_elf_generic_reloc, /* special_function */
    819 	 "R_MIPS_32",		/* name */
    820 	 FALSE,			/* partial_inplace */
    821 	 0,			/* src_mask */
    822 	 0xffffffff,		/* dst_mask */
    823 	 FALSE),		/* pcrel_offset */
    824 
    825   /* 32 bit symbol relative relocation.  */
    826   HOWTO (R_MIPS_REL32,		/* type */
    827 	 0,			/* rightshift */
    828 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    829 	 32,			/* bitsize */
    830 	 FALSE,			/* pc_relative */
    831 	 0,			/* bitpos */
    832 	 complain_overflow_dont, /* complain_on_overflow */
    833 	 _bfd_mips_elf_generic_reloc, /* special_function */
    834 	 "R_MIPS_REL32",	/* name */
    835 	 FALSE,			/* partial_inplace */
    836 	 0,			/* src_mask */
    837 	 0xffffffff,		/* dst_mask */
    838 	 FALSE),		/* pcrel_offset */
    839 
    840   /* 26 bit jump address.  */
    841   HOWTO (R_MIPS_26,		/* type */
    842 	 2,			/* rightshift */
    843 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    844 	 26,			/* bitsize */
    845 	 FALSE,			/* pc_relative */
    846 	 0,			/* bitpos */
    847 	 complain_overflow_dont, /* complain_on_overflow */
    848 				/* This needs complex overflow
    849 				   detection, because the upper 36
    850 				   bits must match the PC + 4.  */
    851 	 _bfd_mips_elf_generic_reloc, /* special_function */
    852 	 "R_MIPS_26",		/* name */
    853 	 FALSE,			/* partial_inplace */
    854 	 0,			/* src_mask */
    855 	 0x03ffffff,		/* dst_mask */
    856 	 FALSE),		/* pcrel_offset */
    857 
    858   /* High 16 bits of symbol value.  */
    859   HOWTO (R_MIPS_HI16,		/* type */
    860 	 0,			/* rightshift */
    861 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    862 	 16,			/* bitsize */
    863 	 FALSE,			/* pc_relative */
    864 	 0,			/* bitpos */
    865 	 complain_overflow_dont, /* complain_on_overflow */
    866 	 _bfd_mips_elf_generic_reloc, /* special_function */
    867 	 "R_MIPS_HI16",		/* name */
    868 	 FALSE,			/* partial_inplace */
    869 	 0,			/* src_mask */
    870 	 0x0000ffff,		/* dst_mask */
    871 	 FALSE),		/* pcrel_offset */
    872 
    873   /* Low 16 bits of symbol value.  */
    874   HOWTO (R_MIPS_LO16,		/* type */
    875 	 0,			/* rightshift */
    876 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    877 	 16,			/* bitsize */
    878 	 FALSE,			/* pc_relative */
    879 	 0,			/* bitpos */
    880 	 complain_overflow_dont, /* complain_on_overflow */
    881 	 _bfd_mips_elf_generic_reloc, /* special_function */
    882 	 "R_MIPS_LO16",		/* name */
    883 	 FALSE,			/* partial_inplace */
    884 	 0,			/* src_mask */
    885 	 0x0000ffff,		/* dst_mask */
    886 	 FALSE),		/* pcrel_offset */
    887 
    888   /* GP relative reference.  */
    889   HOWTO (R_MIPS_GPREL16,	/* type */
    890 	 0,			/* rightshift */
    891 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    892 	 16,			/* bitsize */
    893 	 FALSE,			/* pc_relative */
    894 	 0,			/* bitpos */
    895 	 complain_overflow_signed, /* complain_on_overflow */
    896 	 mips_elf_gprel16_reloc, /* special_function */
    897 	 "R_MIPS_GPREL16",	/* name */
    898 	 FALSE,			/* partial_inplace */
    899 	 0,			/* src_mask */
    900 	 0x0000ffff,		/* dst_mask */
    901 	 FALSE),		/* pcrel_offset */
    902 
    903   /* Reference to literal section.  */
    904   HOWTO (R_MIPS_LITERAL,	/* type */
    905 	 0,			/* rightshift */
    906 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    907 	 16,			/* bitsize */
    908 	 FALSE,			/* pc_relative */
    909 	 0,			/* bitpos */
    910 	 complain_overflow_signed, /* complain_on_overflow */
    911 	 mips_elf_literal_reloc, /* special_function */
    912 	 "R_MIPS_LITERAL",	/* name */
    913 	 FALSE,			/* partial_inplace */
    914 	 0,			/* src_mask */
    915 	 0x0000ffff,		/* dst_mask */
    916 	 FALSE),		/* pcrel_offset */
    917 
    918   /* Reference to global offset table.  */
    919   HOWTO (R_MIPS_GOT16,		/* type */
    920 	 0,			/* rightshift */
    921 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    922 	 16,			/* bitsize */
    923 	 FALSE,			/* pc_relative */
    924 	 0,			/* bitpos */
    925 	 complain_overflow_signed, /* complain_on_overflow */
    926 	 _bfd_mips_elf_generic_reloc, /* special_function */
    927 	 "R_MIPS_GOT16",	/* name */
    928 	 FALSE,			/* partial_inplace */
    929 	 0,			/* src_mask */
    930 	 0x0000ffff,		/* dst_mask */
    931 	 FALSE),		/* pcrel_offset */
    932 
    933   /* 16 bit PC relative reference.  Note that the ABI document has a typo
    934      and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
    935      We do the right thing here.  */
    936   HOWTO (R_MIPS_PC16,		/* type */
    937 	 2,			/* rightshift */
    938 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    939 	 16,			/* bitsize */
    940 	 TRUE,			/* pc_relative */
    941 	 0,			/* bitpos */
    942 	 complain_overflow_signed, /* complain_on_overflow */
    943 	 _bfd_mips_elf_generic_reloc, /* special_function */
    944 	 "R_MIPS_PC16",		/* name */
    945 	 FALSE,			/* partial_inplace */
    946 	 0,			/* src_mask */
    947 	 0x0000ffff,		/* dst_mask */
    948 	 TRUE),			/* pcrel_offset */
    949 
    950   /* 16 bit call through global offset table.  */
    951   HOWTO (R_MIPS_CALL16,		/* type */
    952 	 0,			/* rightshift */
    953 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    954 	 16,			/* bitsize */
    955 	 FALSE,			/* pc_relative */
    956 	 0,			/* bitpos */
    957 	 complain_overflow_signed, /* complain_on_overflow */
    958 	 _bfd_mips_elf_generic_reloc, /* special_function */
    959 	 "R_MIPS_CALL16",	/* name */
    960 	 FALSE,			/* partial_inplace */
    961 	 0,			/* src_mask */
    962 	 0x0000ffff,		/* dst_mask */
    963 	 FALSE),		/* pcrel_offset */
    964 
    965   /* 32 bit GP relative reference.  */
    966   HOWTO (R_MIPS_GPREL32,	/* type */
    967 	 0,			/* rightshift */
    968 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    969 	 32,			/* bitsize */
    970 	 FALSE,			/* pc_relative */
    971 	 0,			/* bitpos */
    972 	 complain_overflow_dont, /* complain_on_overflow */
    973 	 mips_elf_gprel32_reloc, /* special_function */
    974 	 "R_MIPS_GPREL32",	/* name */
    975 	 FALSE,			/* partial_inplace */
    976 	 0,			/* src_mask */
    977 	 0xffffffff,		/* dst_mask */
    978 	 FALSE),		/* pcrel_offset */
    979 
    980   EMPTY_HOWTO (13),
    981   EMPTY_HOWTO (14),
    982   EMPTY_HOWTO (15),
    983 
    984   /* A 5 bit shift field.  */
    985   HOWTO (R_MIPS_SHIFT5,		/* type */
    986 	 0,			/* rightshift */
    987 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    988 	 5,			/* bitsize */
    989 	 FALSE,			/* pc_relative */
    990 	 6,			/* bitpos */
    991 	 complain_overflow_bitfield, /* complain_on_overflow */
    992 	 _bfd_mips_elf_generic_reloc, /* special_function */
    993 	 "R_MIPS_SHIFT5",	/* name */
    994 	 FALSE,			/* partial_inplace */
    995 	 0,			/* src_mask */
    996 	 0x000007c0,		/* dst_mask */
    997 	 FALSE),		/* pcrel_offset */
    998 
    999   /* A 6 bit shift field.  */
   1000   HOWTO (R_MIPS_SHIFT6,		/* type */
   1001 	 0,			/* rightshift */
   1002 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1003 	 6,			/* bitsize */
   1004 	 FALSE,			/* pc_relative */
   1005 	 6,			/* bitpos */
   1006 	 complain_overflow_bitfield, /* complain_on_overflow */
   1007 	 mips_elf_shift6_reloc,	/* special_function */
   1008 	 "R_MIPS_SHIFT6",	/* name */
   1009 	 FALSE,			/* partial_inplace */
   1010 	 0,			/* src_mask */
   1011 	 0x000007c4,		/* dst_mask */
   1012 	 FALSE),		/* pcrel_offset */
   1013 
   1014   /* 64 bit relocation.  */
   1015   HOWTO (R_MIPS_64,		/* type */
   1016 	 0,			/* rightshift */
   1017 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   1018 	 64,			/* bitsize */
   1019 	 FALSE,			/* pc_relative */
   1020 	 0,			/* bitpos */
   1021 	 complain_overflow_dont, /* complain_on_overflow */
   1022 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1023 	 "R_MIPS_64",		/* name */
   1024 	 FALSE,			/* partial_inplace */
   1025 	 0,			/* src_mask */
   1026 	 MINUS_ONE,		/* dst_mask */
   1027 	 FALSE),		/* pcrel_offset */
   1028 
   1029   /* Displacement in the global offset table.  */
   1030   HOWTO (R_MIPS_GOT_DISP,	/* type */
   1031 	 0,			/* rightshift */
   1032 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1033 	 16,			/* bitsize */
   1034 	 FALSE,			/* pc_relative */
   1035 	 0,			/* bitpos */
   1036 	 complain_overflow_signed, /* complain_on_overflow */
   1037 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1038 	 "R_MIPS_GOT_DISP",	/* name */
   1039 	 FALSE,			/* partial_inplace */
   1040 	 0,			/* src_mask */
   1041 	 0x0000ffff,		/* dst_mask */
   1042 	 FALSE),		/* pcrel_offset */
   1043 
   1044   /* Displacement to page pointer in the global offset table.  */
   1045   HOWTO (R_MIPS_GOT_PAGE,	/* type */
   1046 	 0,			/* rightshift */
   1047 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1048 	 16,			/* bitsize */
   1049 	 FALSE,			/* pc_relative */
   1050 	 0,			/* bitpos */
   1051 	 complain_overflow_signed, /* complain_on_overflow */
   1052 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1053 	 "R_MIPS_GOT_PAGE",	/* name */
   1054 	 FALSE,			/* partial_inplace */
   1055 	 0,			/* src_mask */
   1056 	 0x0000ffff,		/* dst_mask */
   1057 	 FALSE),		/* pcrel_offset */
   1058 
   1059   /* Offset from page pointer in the global offset table.  */
   1060   HOWTO (R_MIPS_GOT_OFST,	/* type */
   1061 	 0,			/* rightshift */
   1062 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1063 	 16,			/* bitsize */
   1064 	 FALSE,			/* pc_relative */
   1065 	 0,			/* bitpos */
   1066 	 complain_overflow_signed, /* complain_on_overflow */
   1067 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1068 	 "R_MIPS_GOT_OFST",	/* name */
   1069 	 FALSE,			/* partial_inplace */
   1070 	 0,			/* src_mask */
   1071 	 0x0000ffff,		/* dst_mask */
   1072 	 FALSE),		/* pcrel_offset */
   1073 
   1074   /* High 16 bits of displacement in global offset table.  */
   1075   HOWTO (R_MIPS_GOT_HI16,	/* type */
   1076 	 0,			/* rightshift */
   1077 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1078 	 16,			/* bitsize */
   1079 	 FALSE,			/* pc_relative */
   1080 	 0,			/* bitpos */
   1081 	 complain_overflow_dont, /* complain_on_overflow */
   1082 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1083 	 "R_MIPS_GOT_HI16",	/* name */
   1084 	 FALSE,			/* partial_inplace */
   1085 	 0,			/* src_mask */
   1086 	 0x0000ffff,		/* dst_mask */
   1087 	 FALSE),		/* pcrel_offset */
   1088 
   1089   /* Low 16 bits of displacement in global offset table.  */
   1090   HOWTO (R_MIPS_GOT_LO16,	/* type */
   1091 	 0,			/* rightshift */
   1092 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1093 	 16,			/* bitsize */
   1094 	 FALSE,			/* pc_relative */
   1095 	 0,			/* bitpos */
   1096 	 complain_overflow_dont, /* complain_on_overflow */
   1097 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1098 	 "R_MIPS_GOT_LO16",	/* name */
   1099 	 FALSE,			/* partial_inplace */
   1100 	 0,			/* src_mask */
   1101 	 0x0000ffff,		/* dst_mask */
   1102 	 FALSE),		/* pcrel_offset */
   1103 
   1104   /* 64 bit subtraction.  */
   1105   HOWTO (R_MIPS_SUB,		/* type */
   1106 	 0,			/* rightshift */
   1107 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
   1108 	 64,			/* bitsize */
   1109 	 FALSE,			/* pc_relative */
   1110 	 0,			/* bitpos */
   1111 	 complain_overflow_dont, /* complain_on_overflow */
   1112 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1113 	 "R_MIPS_SUB",		/* name */
   1114 	 FALSE,			/* partial_inplace */
   1115 	 0,			/* src_mask */
   1116 	 MINUS_ONE,		/* dst_mask */
   1117 	 FALSE),		/* pcrel_offset */
   1118 
   1119   /* Insert the addend as an instruction.  */
   1120   /* FIXME: Not handled correctly.  */
   1121   HOWTO (R_MIPS_INSERT_A,	/* type */
   1122 	 0,			/* rightshift */
   1123 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1124 	 32,			/* bitsize */
   1125 	 FALSE,			/* pc_relative */
   1126 	 0,			/* bitpos */
   1127 	 complain_overflow_dont, /* complain_on_overflow */
   1128 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1129 	 "R_MIPS_INSERT_A",	/* name */
   1130 	 FALSE,			/* partial_inplace */
   1131 	 0,			/* src_mask */
   1132 	 0xffffffff,		/* dst_mask */
   1133 	 FALSE),		/* pcrel_offset */
   1134 
   1135   /* Insert the addend as an instruction, and change all relocations
   1136      to refer to the old instruction at the address.  */
   1137   /* FIXME: Not handled correctly.  */
   1138   HOWTO (R_MIPS_INSERT_B,	/* type */
   1139 	 0,			/* rightshift */
   1140 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1141 	 32,			/* bitsize */
   1142 	 FALSE,			/* pc_relative */
   1143 	 0,			/* bitpos */
   1144 	 complain_overflow_dont, /* complain_on_overflow */
   1145 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1146 	 "R_MIPS_INSERT_B",	/* name */
   1147 	 FALSE,			/* partial_inplace */
   1148 	 0,			/* src_mask */
   1149 	 0xffffffff,		/* dst_mask */
   1150 	 FALSE),		/* pcrel_offset */
   1151 
   1152   /* Delete a 32 bit instruction.  */
   1153   /* FIXME: Not handled correctly.  */
   1154   HOWTO (R_MIPS_DELETE,		/* type */
   1155 	 0,			/* rightshift */
   1156 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1157 	 32,			/* bitsize */
   1158 	 FALSE,			/* pc_relative */
   1159 	 0,			/* bitpos */
   1160 	 complain_overflow_dont, /* complain_on_overflow */
   1161 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1162 	 "R_MIPS_DELETE",	/* name */
   1163 	 FALSE,			/* partial_inplace */
   1164 	 0,			/* src_mask */
   1165 	 0xffffffff,		/* dst_mask */
   1166 	 FALSE),		/* pcrel_offset */
   1167 
   1168   /* Get the higher value of a 64 bit addend.  */
   1169   HOWTO (R_MIPS_HIGHER,		/* type */
   1170 	 0,			/* rightshift */
   1171 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1172 	 16,			/* bitsize */
   1173 	 FALSE,			/* pc_relative */
   1174 	 0,			/* bitpos */
   1175 	 complain_overflow_dont, /* complain_on_overflow */
   1176 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1177 	 "R_MIPS_HIGHER",	/* name */
   1178 	 FALSE,			/* partial_inplace */
   1179 	 0,			/* src_mask */
   1180 	 0x0000ffff,		/* dst_mask */
   1181 	 FALSE),		/* pcrel_offset */
   1182 
   1183   /* Get the highest value of a 64 bit addend.  */
   1184   HOWTO (R_MIPS_HIGHEST,	/* type */
   1185 	 0,			/* rightshift */
   1186 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1187 	 16,			/* bitsize */
   1188 	 FALSE,			/* pc_relative */
   1189 	 0,			/* bitpos */
   1190 	 complain_overflow_dont, /* complain_on_overflow */
   1191 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1192 	 "R_MIPS_HIGHEST",	/* name */
   1193 	 FALSE,			/* partial_inplace */
   1194 	 0,			/* src_mask */
   1195 	 0x0000ffff,		/* dst_mask */
   1196 	 FALSE),		/* pcrel_offset */
   1197 
   1198   /* High 16 bits of displacement in global offset table.  */
   1199   HOWTO (R_MIPS_CALL_HI16,	/* type */
   1200 	 0,			/* rightshift */
   1201 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1202 	 16,			/* bitsize */
   1203 	 FALSE,			/* pc_relative */
   1204 	 0,			/* bitpos */
   1205 	 complain_overflow_dont, /* complain_on_overflow */
   1206 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1207 	 "R_MIPS_CALL_HI16",	/* name */
   1208 	 FALSE,			/* partial_inplace */
   1209 	 0,			/* src_mask */
   1210 	 0x0000ffff,		/* dst_mask */
   1211 	 FALSE),		/* pcrel_offset */
   1212 
   1213   /* Low 16 bits of displacement in global offset table.  */
   1214   HOWTO (R_MIPS_CALL_LO16,	/* type */
   1215 	 0,			/* rightshift */
   1216 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1217 	 16,			/* bitsize */
   1218 	 FALSE,			/* pc_relative */
   1219 	 0,			/* bitpos */
   1220 	 complain_overflow_dont, /* complain_on_overflow */
   1221 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1222 	 "R_MIPS_CALL_LO16",	/* name */
   1223 	 FALSE,			/* partial_inplace */
   1224 	 0,			/* src_mask */
   1225 	 0x0000ffff,		/* dst_mask */
   1226 	 FALSE),		/* pcrel_offset */
   1227 
   1228   /* Section displacement, used by an associated event location section.  */
   1229   HOWTO (R_MIPS_SCN_DISP,	/* type */
   1230 	 0,			/* rightshift */
   1231 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1232 	 32,			/* bitsize */
   1233 	 FALSE,			/* pc_relative */
   1234 	 0,			/* bitpos */
   1235 	 complain_overflow_dont, /* complain_on_overflow */
   1236 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1237 	 "R_MIPS_SCN_DISP",	/* name */
   1238 	 FALSE,			/* partial_inplace */
   1239 	 0,			/* src_mask */
   1240 	 0xffffffff,		/* dst_mask */
   1241 	 FALSE),		/* pcrel_offset */
   1242 
   1243   /* 16 bit relocation.  */
   1244   HOWTO (R_MIPS_REL16,		/* type */
   1245 	 0,			/* rightshift */
   1246 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
   1247 	 16,			/* bitsize */
   1248 	 FALSE,			/* pc_relative */
   1249 	 0,			/* bitpos */
   1250 	 complain_overflow_signed, /* complain_on_overflow */
   1251 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1252 	 "R_MIPS_REL16",	/* name */
   1253 	 FALSE,			/* partial_inplace */
   1254 	 0,			/* src_mask */
   1255 	 0xffff,		/* dst_mask */
   1256 	 FALSE),		/* pcrel_offset */
   1257 
   1258   /* These two are obsolete.  */
   1259   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
   1260   EMPTY_HOWTO (R_MIPS_PJUMP),
   1261 
   1262   /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
   1263      It must be used for multigot GOT's (and only there).  */
   1264   HOWTO (R_MIPS_RELGOT,		/* type */
   1265 	 0,			/* rightshift */
   1266 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1267 	 32,			/* bitsize */
   1268 	 FALSE,			/* pc_relative */
   1269 	 0,			/* bitpos */
   1270 	 complain_overflow_dont, /* complain_on_overflow */
   1271 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1272 	 "R_MIPS_RELGOT",	/* name */
   1273 	 FALSE,			/* partial_inplace */
   1274 	 0,			/* src_mask */
   1275 	 0xffffffff,		/* dst_mask */
   1276 	 FALSE),		/* pcrel_offset */
   1277 
   1278   /* Protected jump conversion.  This is an optimization hint.  No
   1279      relocation is required for correctness.  */
   1280   HOWTO (R_MIPS_JALR,	        /* type */
   1281 	 0,			/* rightshift */
   1282 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1283 	 32,			/* bitsize */
   1284 	 FALSE,			/* pc_relative */
   1285 	 0,			/* bitpos */
   1286 	 complain_overflow_dont, /* complain_on_overflow */
   1287 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1288 	 "R_MIPS_JALR",	        /* name */
   1289 	 FALSE,			/* partial_inplace */
   1290 	 0,			/* src_mask */
   1291 	 0,			/* dst_mask */
   1292 	 FALSE),		/* pcrel_offset */
   1293 
   1294   /* TLS GD/LD dynamic relocations.  */
   1295   HOWTO (R_MIPS_TLS_DTPMOD32,	/* type */
   1296 	 0,			/* rightshift */
   1297 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1298 	 32,			/* bitsize */
   1299 	 FALSE,			/* pc_relative */
   1300 	 0,			/* bitpos */
   1301 	 complain_overflow_dont, /* complain_on_overflow */
   1302 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1303 	 "R_MIPS_TLS_DTPMOD32",	/* name */
   1304 	 FALSE,			/* partial_inplace */
   1305 	 0xffffffff,		/* src_mask */
   1306 	 0xffffffff,		/* dst_mask */
   1307 	 FALSE),		/* pcrel_offset */
   1308 
   1309   HOWTO (R_MIPS_TLS_DTPREL32,	/* type */
   1310 	 0,			/* rightshift */
   1311 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1312 	 32,			/* bitsize */
   1313 	 FALSE,			/* pc_relative */
   1314 	 0,			/* bitpos */
   1315 	 complain_overflow_dont, /* complain_on_overflow */
   1316 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1317 	 "R_MIPS_TLS_DTPREL32",	/* name */
   1318 	 FALSE,			/* partial_inplace */
   1319 	 0xffffffff,		/* src_mask */
   1320 	 0xffffffff,		/* dst_mask */
   1321 	 FALSE),		/* pcrel_offset */
   1322 
   1323   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
   1324   EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
   1325 
   1326   /* TLS general dynamic variable reference.  */
   1327   HOWTO (R_MIPS_TLS_GD,		/* type */
   1328 	 0,			/* rightshift */
   1329 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1330 	 16,			/* bitsize */
   1331 	 FALSE,			/* pc_relative */
   1332 	 0,			/* bitpos */
   1333 	 complain_overflow_signed, /* complain_on_overflow */
   1334 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1335 	 "R_MIPS_TLS_GD",	/* name */
   1336 	 FALSE,			/* partial_inplace */
   1337 	 0x0000ffff,		/* src_mask */
   1338 	 0x0000ffff,		/* dst_mask */
   1339 	 FALSE),		/* pcrel_offset */
   1340 
   1341   /* TLS local dynamic variable reference.  */
   1342   HOWTO (R_MIPS_TLS_LDM,	/* type */
   1343 	 0,			/* rightshift */
   1344 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1345 	 16,			/* bitsize */
   1346 	 FALSE,			/* pc_relative */
   1347 	 0,			/* bitpos */
   1348 	 complain_overflow_signed, /* complain_on_overflow */
   1349 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1350 	 "R_MIPS_TLS_LDM",	/* name */
   1351 	 FALSE,			/* partial_inplace */
   1352 	 0x0000ffff,		/* src_mask */
   1353 	 0x0000ffff,		/* dst_mask */
   1354 	 FALSE),		/* pcrel_offset */
   1355 
   1356   /* TLS local dynamic offset.  */
   1357   HOWTO (R_MIPS_TLS_DTPREL_HI16,	/* type */
   1358 	 0,			/* rightshift */
   1359 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1360 	 16,			/* bitsize */
   1361 	 FALSE,			/* pc_relative */
   1362 	 0,			/* bitpos */
   1363 	 complain_overflow_signed, /* complain_on_overflow */
   1364 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1365 	 "R_MIPS_TLS_DTPREL_HI16",	/* name */
   1366 	 FALSE,			/* partial_inplace */
   1367 	 0x0000ffff,		/* src_mask */
   1368 	 0x0000ffff,		/* dst_mask */
   1369 	 FALSE),		/* pcrel_offset */
   1370 
   1371   /* TLS local dynamic offset.  */
   1372   HOWTO (R_MIPS_TLS_DTPREL_LO16,	/* type */
   1373 	 0,			/* rightshift */
   1374 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1375 	 16,			/* bitsize */
   1376 	 FALSE,			/* pc_relative */
   1377 	 0,			/* bitpos */
   1378 	 complain_overflow_signed, /* complain_on_overflow */
   1379 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1380 	 "R_MIPS_TLS_DTPREL_LO16",	/* name */
   1381 	 FALSE,			/* partial_inplace */
   1382 	 0x0000ffff,		/* src_mask */
   1383 	 0x0000ffff,		/* dst_mask */
   1384 	 FALSE),		/* pcrel_offset */
   1385 
   1386   /* TLS thread pointer offset.  */
   1387   HOWTO (R_MIPS_TLS_GOTTPREL,	/* type */
   1388 	 0,			/* rightshift */
   1389 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1390 	 16,			/* bitsize */
   1391 	 FALSE,			/* pc_relative */
   1392 	 0,			/* bitpos */
   1393 	 complain_overflow_signed, /* complain_on_overflow */
   1394 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1395 	 "R_MIPS_TLS_GOTTPREL",	/* name */
   1396 	 FALSE,			/* partial_inplace */
   1397 	 0x0000ffff,		/* src_mask */
   1398 	 0x0000ffff,		/* dst_mask */
   1399 	 FALSE),		/* pcrel_offset */
   1400 
   1401   /* TLS IE dynamic relocations.  */
   1402   HOWTO (R_MIPS_TLS_TPREL32,	/* type */
   1403 	 0,			/* rightshift */
   1404 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1405 	 32,			/* bitsize */
   1406 	 FALSE,			/* pc_relative */
   1407 	 0,			/* bitpos */
   1408 	 complain_overflow_dont, /* complain_on_overflow */
   1409 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1410 	 "R_MIPS_TLS_TPREL32",	/* name */
   1411 	 FALSE,			/* partial_inplace */
   1412 	 0xffffffff,		/* src_mask */
   1413 	 0xffffffff,		/* dst_mask */
   1414 	 FALSE),		/* pcrel_offset */
   1415 
   1416   EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
   1417 
   1418   /* TLS thread pointer offset.  */
   1419   HOWTO (R_MIPS_TLS_TPREL_HI16,	/* type */
   1420 	 0,			/* rightshift */
   1421 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1422 	 16,			/* bitsize */
   1423 	 FALSE,			/* pc_relative */
   1424 	 0,			/* bitpos */
   1425 	 complain_overflow_signed, /* complain_on_overflow */
   1426 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1427 	 "R_MIPS_TLS_TPREL_HI16", /* name */
   1428 	 FALSE,			/* partial_inplace */
   1429 	 0x0000ffff,		/* src_mask */
   1430 	 0x0000ffff,		/* dst_mask */
   1431 	 FALSE),		/* pcrel_offset */
   1432 
   1433   /* TLS thread pointer offset.  */
   1434   HOWTO (R_MIPS_TLS_TPREL_LO16,	/* type */
   1435 	 0,			/* rightshift */
   1436 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1437 	 16,			/* bitsize */
   1438 	 FALSE,			/* pc_relative */
   1439 	 0,			/* bitpos */
   1440 	 complain_overflow_signed, /* complain_on_overflow */
   1441 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1442 	 "R_MIPS_TLS_TPREL_LO16", /* name */
   1443 	 FALSE,			/* partial_inplace */
   1444 	 0x0000ffff,		/* src_mask */
   1445 	 0x0000ffff,		/* dst_mask */
   1446 	 FALSE),		/* pcrel_offset */
   1447 
   1448   /* 32 bit relocation with no addend.  */
   1449   HOWTO (R_MIPS_GLOB_DAT,	/* type */
   1450 	 0,			/* rightshift */
   1451 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1452 	 32,			/* bitsize */
   1453 	 FALSE,			/* pc_relative */
   1454 	 0,			/* bitpos */
   1455 	 complain_overflow_dont, /* complain_on_overflow */
   1456 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1457 	 "R_MIPS_GLOB_DAT",	/* name */
   1458 	 FALSE,			/* partial_inplace */
   1459 	 0x0,			/* src_mask */
   1460 	 0xffffffff,		/* dst_mask */
   1461 	 FALSE),		/* pcrel_offset */
   1462 };
   1463 
   1464 static reloc_howto_type elf_mips16_howto_table_rel[] =
   1465 {
   1466   /* The reloc used for the mips16 jump instruction.  */
   1467   HOWTO (R_MIPS16_26,		/* type */
   1468 	 2,			/* rightshift */
   1469 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1470 	 26,			/* bitsize */
   1471 	 FALSE,			/* pc_relative */
   1472 	 0,			/* bitpos */
   1473 	 complain_overflow_dont, /* complain_on_overflow */
   1474 	 			/* This needs complex overflow
   1475 				   detection, because the upper four
   1476 				   bits must match the PC.  */
   1477 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1478 	 "R_MIPS16_26",		/* name */
   1479 	 TRUE,			/* partial_inplace */
   1480 	 0x3ffffff,		/* src_mask */
   1481 	 0x3ffffff,		/* dst_mask */
   1482 	 FALSE),		/* pcrel_offset */
   1483 
   1484   /* The reloc used for the mips16 gprel instruction.  */
   1485   HOWTO (R_MIPS16_GPREL,	/* type */
   1486 	 0,			/* rightshift */
   1487 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1488 	 16,			/* bitsize */
   1489 	 FALSE,			/* pc_relative */
   1490 	 0,			/* bitpos */
   1491 	 complain_overflow_signed, /* complain_on_overflow */
   1492 	 mips16_gprel_reloc,	/* special_function */
   1493 	 "R_MIPS16_GPREL",	/* name */
   1494 	 TRUE,			/* partial_inplace */
   1495 	 0x0000ffff,		/* src_mask */
   1496 	 0x0000ffff,	        /* dst_mask */
   1497 	 FALSE),		/* pcrel_offset */
   1498 
   1499   /* A MIPS16 reference to the global offset table.  */
   1500   HOWTO (R_MIPS16_GOT16,	/* type */
   1501 	 0,			/* rightshift */
   1502 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1503 	 16,			/* bitsize */
   1504 	 FALSE,			/* pc_relative */
   1505 	 0,			/* bitpos */
   1506 	 complain_overflow_dont, /* complain_on_overflow */
   1507 	 _bfd_mips_elf_got16_reloc, /* special_function */
   1508 	 "R_MIPS16_GOT16",	/* name */
   1509 	 TRUE,			/* partial_inplace */
   1510 	 0x0000ffff,		/* src_mask */
   1511 	 0x0000ffff,	        /* dst_mask */
   1512 	 FALSE),		/* pcrel_offset */
   1513 
   1514   /* A MIPS16 call through the global offset table.  */
   1515   HOWTO (R_MIPS16_CALL16,	/* type */
   1516 	 0,			/* rightshift */
   1517 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1518 	 16,			/* bitsize */
   1519 	 FALSE,			/* pc_relative */
   1520 	 0,			/* bitpos */
   1521 	 complain_overflow_dont, /* complain_on_overflow */
   1522 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1523 	 "R_MIPS16_CALL16",	/* name */
   1524 	 TRUE,			/* partial_inplace */
   1525 	 0x0000ffff,		/* src_mask */
   1526 	 0x0000ffff,	        /* dst_mask */
   1527 	 FALSE),		/* pcrel_offset */
   1528 
   1529   /* MIPS16 high 16 bits of symbol value.  */
   1530   HOWTO (R_MIPS16_HI16,		/* type */
   1531 	 16,			/* rightshift */
   1532 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1533 	 16,			/* bitsize */
   1534 	 FALSE,			/* pc_relative */
   1535 	 0,			/* bitpos */
   1536 	 complain_overflow_dont, /* complain_on_overflow */
   1537 	 _bfd_mips_elf_hi16_reloc, /* special_function */
   1538 	 "R_MIPS16_HI16",	/* name */
   1539 	 TRUE,			/* partial_inplace */
   1540 	 0x0000ffff,		/* src_mask */
   1541 	 0x0000ffff,		/* dst_mask */
   1542 	 FALSE),		/* pcrel_offset */
   1543 
   1544   /* MIPS16 low 16 bits of symbol value.  */
   1545   HOWTO (R_MIPS16_LO16,		/* type */
   1546 	 0,			/* rightshift */
   1547 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1548 	 16,			/* bitsize */
   1549 	 FALSE,			/* pc_relative */
   1550 	 0,			/* bitpos */
   1551 	 complain_overflow_dont, /* complain_on_overflow */
   1552 	 _bfd_mips_elf_lo16_reloc, /* special_function */
   1553 	 "R_MIPS16_LO16",	/* name */
   1554 	 TRUE,			/* partial_inplace */
   1555 	 0x0000ffff,		/* src_mask */
   1556 	 0x0000ffff,		/* dst_mask */
   1557 	 FALSE),		/* pcrel_offset */
   1558 };
   1559 
   1560 static reloc_howto_type elf_mips16_howto_table_rela[] =
   1561 {
   1562   /* The reloc used for the mips16 jump instruction.  */
   1563   HOWTO (R_MIPS16_26,		/* type */
   1564 	 2,			/* rightshift */
   1565 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1566 	 26,			/* bitsize */
   1567 	 FALSE,			/* pc_relative */
   1568 	 0,			/* bitpos */
   1569 	 complain_overflow_dont, /* complain_on_overflow */
   1570 	 			/* This needs complex overflow
   1571 				   detection, because the upper four
   1572 				   bits must match the PC.  */
   1573 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1574 	 "R_MIPS16_26",		/* name */
   1575 	 FALSE,			/* partial_inplace */
   1576 	 0x3ffffff,		/* src_mask */
   1577 	 0x3ffffff,		/* dst_mask */
   1578 	 FALSE),		/* pcrel_offset */
   1579 
   1580   /* The reloc used for the mips16 gprel instruction.  */
   1581   HOWTO (R_MIPS16_GPREL,	/* type */
   1582 	 0,			/* rightshift */
   1583 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1584 	 16,			/* bitsize */
   1585 	 FALSE,			/* pc_relative */
   1586 	 0,			/* bitpos */
   1587 	 complain_overflow_signed, /* complain_on_overflow */
   1588 	 mips16_gprel_reloc,	/* special_function */
   1589 	 "R_MIPS16_GPREL",	/* name */
   1590 	 FALSE,			/* partial_inplace */
   1591 	 0x0000ffff,		/* src_mask */
   1592 	 0x0000ffff,	        /* dst_mask */
   1593 	 FALSE),		/* pcrel_offset */
   1594 
   1595   /* A MIPS16 reference to the global offset table.  */
   1596   HOWTO (R_MIPS16_GOT16,	/* type */
   1597 	 0,			/* rightshift */
   1598 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1599 	 16,			/* bitsize */
   1600 	 FALSE,			/* pc_relative */
   1601 	 0,			/* bitpos */
   1602 	 complain_overflow_dont, /* complain_on_overflow */
   1603 	 _bfd_mips_elf_got16_reloc, /* special_function */
   1604 	 "R_MIPS16_GOT16",	/* name */
   1605 	 FALSE,			/* partial_inplace */
   1606 	 0x0000ffff,		/* src_mask */
   1607 	 0x0000ffff,	        /* dst_mask */
   1608 	 FALSE),		/* pcrel_offset */
   1609 
   1610   /* A MIPS16 call through the global offset table.  */
   1611   HOWTO (R_MIPS16_CALL16,	/* type */
   1612 	 0,			/* rightshift */
   1613 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1614 	 16,			/* bitsize */
   1615 	 FALSE,			/* pc_relative */
   1616 	 0,			/* bitpos */
   1617 	 complain_overflow_dont, /* complain_on_overflow */
   1618 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1619 	 "R_MIPS16_CALL16",	/* name */
   1620 	 FALSE,			/* partial_inplace */
   1621 	 0x0000ffff,		/* src_mask */
   1622 	 0x0000ffff,	        /* dst_mask */
   1623 	 FALSE),		/* pcrel_offset */
   1624 
   1625   /* MIPS16 high 16 bits of symbol value.  */
   1626   HOWTO (R_MIPS16_HI16,		/* type */
   1627 	 16,			/* rightshift */
   1628 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1629 	 16,			/* bitsize */
   1630 	 FALSE,			/* pc_relative */
   1631 	 0,			/* bitpos */
   1632 	 complain_overflow_dont, /* complain_on_overflow */
   1633 	 _bfd_mips_elf_hi16_reloc, /* special_function */
   1634 	 "R_MIPS16_HI16",	/* name */
   1635 	 FALSE,			/* partial_inplace */
   1636 	 0x0000ffff,		/* src_mask */
   1637 	 0x0000ffff,		/* dst_mask */
   1638 	 FALSE),		/* pcrel_offset */
   1639 
   1640   /* MIPS16 low 16 bits of symbol value.  */
   1641   HOWTO (R_MIPS16_LO16,		/* type */
   1642 	 0,			/* rightshift */
   1643 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1644 	 16,			/* bitsize */
   1645 	 FALSE,			/* pc_relative */
   1646 	 0,			/* bitpos */
   1647 	 complain_overflow_dont, /* complain_on_overflow */
   1648 	 _bfd_mips_elf_lo16_reloc, /* special_function */
   1649 	 "R_MIPS16_LO16",	/* name */
   1650 	 FALSE,			/* partial_inplace */
   1651 	 0x0000ffff,		/* src_mask */
   1652 	 0x0000ffff,		/* dst_mask */
   1653 	 FALSE),		/* pcrel_offset */
   1654 };
   1655 
   1656 /* GNU extension to record C++ vtable hierarchy */
   1657 static reloc_howto_type elf_mips_gnu_vtinherit_howto =
   1658   HOWTO (R_MIPS_GNU_VTINHERIT,	/* type */
   1659 	 0,			/* rightshift */
   1660 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1661 	 0,			/* bitsize */
   1662 	 FALSE,			/* pc_relative */
   1663 	 0,			/* bitpos */
   1664 	 complain_overflow_dont, /* complain_on_overflow */
   1665 	 NULL,			/* special_function */
   1666 	 "R_MIPS_GNU_VTINHERIT", /* name */
   1667 	 FALSE,			/* partial_inplace */
   1668 	 0,			/* src_mask */
   1669 	 0,			/* dst_mask */
   1670 	 FALSE);		/* pcrel_offset */
   1671 
   1672 /* GNU extension to record C++ vtable member usage */
   1673 static reloc_howto_type elf_mips_gnu_vtentry_howto =
   1674   HOWTO (R_MIPS_GNU_VTENTRY,	/* type */
   1675 	 0,			/* rightshift */
   1676 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1677 	 0,			/* bitsize */
   1678 	 FALSE,			/* pc_relative */
   1679 	 0,			/* bitpos */
   1680 	 complain_overflow_dont, /* complain_on_overflow */
   1681 	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
   1682 	 "R_MIPS_GNU_VTENTRY",	/* name */
   1683 	 FALSE,			/* partial_inplace */
   1684 	 0,			/* src_mask */
   1685 	 0,			/* dst_mask */
   1686 	 FALSE);		/* pcrel_offset */
   1687 
   1688 /* 16 bit offset for pc-relative branches.  */
   1690 static reloc_howto_type elf_mips_gnu_rel16_s2 =
   1691   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
   1692 	 2,			/* rightshift */
   1693 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1694 	 16,			/* bitsize */
   1695 	 TRUE,			/* pc_relative */
   1696 	 0,			/* bitpos */
   1697 	 complain_overflow_signed, /* complain_on_overflow */
   1698 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1699 	 "R_MIPS_GNU_REL16_S2",	/* name */
   1700 	 TRUE,			/* partial_inplace */
   1701 	 0x0000ffff,		/* src_mask */
   1702 	 0x0000ffff,		/* dst_mask */
   1703 	 TRUE);			/* pcrel_offset */
   1704 
   1705 /* 16 bit offset for pc-relative branches.  */
   1706 static reloc_howto_type elf_mips_gnu_rela16_s2 =
   1707   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
   1708 	 2,			/* rightshift */
   1709 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1710 	 16,			/* bitsize */
   1711 	 TRUE,			/* pc_relative */
   1712 	 0,			/* bitpos */
   1713 	 complain_overflow_signed, /* complain_on_overflow */
   1714 	 _bfd_mips_elf_generic_reloc, /* special_function */
   1715 	 "R_MIPS_GNU_REL16_S2",	/* name */
   1716 	 FALSE,			/* partial_inplace */
   1717 	 0,			/* src_mask */
   1718 	 0x0000ffff,		/* dst_mask */
   1719 	 TRUE);			/* pcrel_offset */
   1720 
   1721 /* Originally a VxWorks extension, but now used for other systems too.  */
   1723 static reloc_howto_type elf_mips_copy_howto =
   1724   HOWTO (R_MIPS_COPY,		/* type */
   1725 	 0,			/* rightshift */
   1726 	 0,			/* this one is variable size */
   1727 	 0,			/* bitsize */
   1728 	 FALSE,			/* pc_relative */
   1729 	 0,			/* bitpos */
   1730 	 complain_overflow_bitfield, /* complain_on_overflow */
   1731 	 bfd_elf_generic_reloc,	/* special_function */
   1732 	 "R_MIPS_COPY",		/* name */
   1733 	 FALSE,			/* partial_inplace */
   1734 	 0x0,         		/* src_mask */
   1735 	 0x0,		        /* dst_mask */
   1736 	 FALSE);		/* pcrel_offset */
   1737 
   1738 /* Originally a VxWorks extension, but now used for other systems too.  */
   1739 static reloc_howto_type elf_mips_jump_slot_howto =
   1740   HOWTO (R_MIPS_JUMP_SLOT,	/* type */
   1741 	 0,			/* rightshift */
   1742 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
   1743 	 32,			/* bitsize */
   1744 	 FALSE,			/* pc_relative */
   1745 	 0,			/* bitpos */
   1746 	 complain_overflow_bitfield, /* complain_on_overflow */
   1747 	 bfd_elf_generic_reloc,	/* special_function */
   1748 	 "R_MIPS_JUMP_SLOT",	/* name */
   1749 	 FALSE,			/* partial_inplace */
   1750 	 0x0,         		/* src_mask */
   1751 	 0x0,		        /* dst_mask */
   1752 	 FALSE);		/* pcrel_offset */
   1753 
   1754 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
   1756    dangerous relocation.  */
   1757 
   1758 static bfd_boolean
   1759 mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
   1760 {
   1761   unsigned int count;
   1762   asymbol **sym;
   1763   unsigned int i;
   1764 
   1765   /* If we've already figured out what GP will be, just return it.  */
   1766   *pgp = _bfd_get_gp_value (output_bfd);
   1767   if (*pgp)
   1768     return TRUE;
   1769 
   1770   count = bfd_get_symcount (output_bfd);
   1771   sym = bfd_get_outsymbols (output_bfd);
   1772 
   1773   /* The linker script will have created a symbol named `_gp' with the
   1774      appropriate value.  */
   1775   if (sym == NULL)
   1776     i = count;
   1777   else
   1778     {
   1779       for (i = 0; i < count; i++, sym++)
   1780 	{
   1781 	  register const char *name;
   1782 
   1783 	  name = bfd_asymbol_name (*sym);
   1784 	  if (*name == '_' && strcmp (name, "_gp") == 0)
   1785 	    {
   1786 	      *pgp = bfd_asymbol_value (*sym);
   1787 	      _bfd_set_gp_value (output_bfd, *pgp);
   1788 	      break;
   1789 	    }
   1790 	}
   1791     }
   1792 
   1793   if (i >= count)
   1794     {
   1795       /* Only get the error once.  */
   1796       *pgp = 4;
   1797       _bfd_set_gp_value (output_bfd, *pgp);
   1798       return FALSE;
   1799     }
   1800 
   1801   return TRUE;
   1802 }
   1803 
   1804 /* We have to figure out the gp value, so that we can adjust the
   1805    symbol value correctly.  We look up the symbol _gp in the output
   1806    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
   1807    target data.  We don't need to adjust the symbol value for an
   1808    external symbol if we are producing relocatable output.  */
   1809 
   1810 static bfd_reloc_status_type
   1811 mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
   1812 		   char **error_message, bfd_vma *pgp)
   1813 {
   1814   if (bfd_is_und_section (symbol->section)
   1815       && ! relocatable)
   1816     {
   1817       *pgp = 0;
   1818       return bfd_reloc_undefined;
   1819     }
   1820 
   1821   *pgp = _bfd_get_gp_value (output_bfd);
   1822   if (*pgp == 0
   1823       && (! relocatable
   1824 	  || (symbol->flags & BSF_SECTION_SYM) != 0))
   1825     {
   1826       if (relocatable)
   1827 	{
   1828 	  /* Make up a value.  */
   1829 	  *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
   1830 	  _bfd_set_gp_value (output_bfd, *pgp);
   1831 	}
   1832       else if (!mips_elf_assign_gp (output_bfd, pgp))
   1833 	{
   1834 	  *error_message =
   1835 	    (char *) _("GP relative relocation when _gp not defined");
   1836 	  return bfd_reloc_dangerous;
   1837 	}
   1838     }
   1839 
   1840   return bfd_reloc_ok;
   1841 }
   1842 
   1843 /* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
   1844    become the offset from the gp register.  */
   1845 
   1846 static bfd_reloc_status_type
   1847 mips_elf_gprel16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
   1848 			asymbol *symbol, void *data ATTRIBUTE_UNUSED,
   1849 			asection *input_section, bfd *output_bfd,
   1850 			char **error_message ATTRIBUTE_UNUSED)
   1851 {
   1852   bfd_boolean relocatable;
   1853   bfd_reloc_status_type ret;
   1854   bfd_vma gp;
   1855 
   1856   if (output_bfd != NULL)
   1857     relocatable = TRUE;
   1858   else
   1859     {
   1860       relocatable = FALSE;
   1861       output_bfd = symbol->section->output_section->owner;
   1862     }
   1863 
   1864   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
   1865 			   &gp);
   1866   if (ret != bfd_reloc_ok)
   1867     return ret;
   1868 
   1869   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   1870 					input_section, relocatable,
   1871 					data, gp);
   1872 }
   1873 
   1874 /* Do a R_MIPS_LITERAL relocation.  */
   1875 
   1876 static bfd_reloc_status_type
   1877 mips_elf_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   1878 			void *data, asection *input_section, bfd *output_bfd,
   1879 			char **error_message)
   1880 {
   1881   bfd_boolean relocatable;
   1882   bfd_reloc_status_type ret;
   1883   bfd_vma gp;
   1884 
   1885   /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
   1886   if (output_bfd != NULL
   1887       && (symbol->flags & BSF_SECTION_SYM) == 0
   1888       && (symbol->flags & BSF_LOCAL) != 0)
   1889     {
   1890       *error_message = (char *)
   1891 	_("literal relocation occurs for an external symbol");
   1892       return bfd_reloc_outofrange;
   1893     }
   1894 
   1895   /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
   1896   if (output_bfd != NULL)
   1897     relocatable = TRUE;
   1898   else
   1899     {
   1900       relocatable = FALSE;
   1901       output_bfd = symbol->section->output_section->owner;
   1902     }
   1903 
   1904   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
   1905 			   &gp);
   1906   if (ret != bfd_reloc_ok)
   1907     return ret;
   1908 
   1909   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   1910 					input_section, relocatable,
   1911 					data, gp);
   1912 }
   1913 
   1914 /* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
   1915    become the offset from the gp register.  */
   1916 
   1917 static bfd_reloc_status_type
   1918 mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   1919 			void *data, asection *input_section, bfd *output_bfd,
   1920 			char **error_message)
   1921 {
   1922   bfd_boolean relocatable;
   1923   bfd_reloc_status_type ret;
   1924   bfd_vma gp;
   1925 
   1926   /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
   1927   if (output_bfd != NULL
   1928       && (symbol->flags & BSF_SECTION_SYM) == 0
   1929       && (symbol->flags & BSF_LOCAL) != 0)
   1930     {
   1931       *error_message = (char *)
   1932 	_("32bits gp relative relocation occurs for an external symbol");
   1933       return bfd_reloc_outofrange;
   1934     }
   1935 
   1936   if (output_bfd != NULL)
   1937     {
   1938       relocatable = TRUE;
   1939       gp = _bfd_get_gp_value (output_bfd);
   1940     }
   1941   else
   1942     {
   1943       relocatable = FALSE;
   1944       output_bfd = symbol->section->output_section->owner;
   1945 
   1946       ret = mips_elf_final_gp (output_bfd, symbol, relocatable,
   1947 			       error_message, &gp);
   1948       if (ret != bfd_reloc_ok)
   1949 	return ret;
   1950     }
   1951 
   1952   return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
   1953 			  relocatable, data, gp);
   1954 }
   1955 
   1956 static bfd_reloc_status_type
   1957 gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry,
   1958 		 asection *input_section, bfd_boolean relocatable,
   1959 		 void *data, bfd_vma gp)
   1960 {
   1961   bfd_vma relocation;
   1962   unsigned long val;
   1963 
   1964   if (bfd_is_com_section (symbol->section))
   1965     relocation = 0;
   1966   else
   1967     relocation = symbol->value;
   1968 
   1969   relocation += symbol->section->output_section->vma;
   1970   relocation += symbol->section->output_offset;
   1971 
   1972   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
   1973     return bfd_reloc_outofrange;
   1974 
   1975   if (reloc_entry->howto->src_mask == 0)
   1976     val = 0;
   1977   else
   1978     val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
   1979 
   1980   /* Set val to the offset into the section or symbol.  */
   1981   val += reloc_entry->addend;
   1982 
   1983   /* Adjust val for the final section location and GP value.  If we
   1984      are producing relocatable output, we don't want to do this for
   1985      an external symbol.  */
   1986   if (! relocatable
   1987       || (symbol->flags & BSF_SECTION_SYM) != 0)
   1988     val += relocation - gp;
   1989 
   1990   bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
   1991 
   1992   if (relocatable)
   1993     reloc_entry->address += input_section->output_offset;
   1994 
   1995   return bfd_reloc_ok;
   1996 }
   1997 
   1998 /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
   1999    the rest is at bits 6-10. The bitpos already got right by the howto.  */
   2000 
   2001 static bfd_reloc_status_type
   2002 mips_elf_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   2003 		       void *data, asection *input_section, bfd *output_bfd,
   2004 		       char **error_message)
   2005 {
   2006   if (reloc_entry->howto->partial_inplace)
   2007     {
   2008       reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
   2009 			     | (reloc_entry->addend & 0x00000800) >> 9);
   2010     }
   2011 
   2012   return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
   2013 				      input_section, output_bfd,
   2014 				      error_message);
   2015 }
   2016 
   2017 /* Handle a mips16 GP relative reloc.  */
   2019 
   2020 static bfd_reloc_status_type
   2021 mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   2022 		    void *data, asection *input_section, bfd *output_bfd,
   2023 		    char **error_message)
   2024 {
   2025   bfd_boolean relocatable;
   2026   bfd_reloc_status_type ret;
   2027   bfd_byte *location;
   2028   bfd_vma gp;
   2029 
   2030   /* If we're relocating, and this is an external symbol, we don't want
   2031      to change anything.  */
   2032   if (output_bfd != NULL
   2033       && (symbol->flags & BSF_SECTION_SYM) == 0
   2034       && (symbol->flags & BSF_LOCAL) != 0)
   2035     {
   2036       reloc_entry->address += input_section->output_offset;
   2037       return bfd_reloc_ok;
   2038     }
   2039 
   2040   if (output_bfd != NULL)
   2041     relocatable = TRUE;
   2042   else
   2043     {
   2044       relocatable = FALSE;
   2045       output_bfd = symbol->section->output_section->owner;
   2046     }
   2047 
   2048   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
   2049 			   &gp);
   2050   if (ret != bfd_reloc_ok)
   2051     return ret;
   2052 
   2053   location = (bfd_byte *) data + reloc_entry->address;
   2054   _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
   2055 				   location);
   2056   ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
   2057 				       input_section, relocatable,
   2058 				       data, gp);
   2059   _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
   2060 				 location);
   2061 
   2062   return ret;
   2063 }
   2064 
   2065 /* A mapping from BFD reloc types to MIPS ELF reloc types.  */
   2067 
   2068 struct elf_reloc_map {
   2069   bfd_reloc_code_real_type bfd_val;
   2070   enum elf_mips_reloc_type elf_val;
   2071 };
   2072 
   2073 static const struct elf_reloc_map mips_reloc_map[] =
   2074 {
   2075   { BFD_RELOC_NONE, R_MIPS_NONE },
   2076   { BFD_RELOC_16, R_MIPS_16 },
   2077   { BFD_RELOC_32, R_MIPS_32 },
   2078   /* There is no BFD reloc for R_MIPS_REL32.  */
   2079   { BFD_RELOC_CTOR, R_MIPS_32 },
   2080   { BFD_RELOC_64, R_MIPS_64 },
   2081   { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
   2082   { BFD_RELOC_HI16_S, R_MIPS_HI16 },
   2083   { BFD_RELOC_LO16, R_MIPS_LO16 },
   2084   { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
   2085   { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
   2086   { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
   2087   { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
   2088   { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
   2089   { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
   2090   { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
   2091   { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
   2092   { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
   2093   { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
   2094   { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
   2095   { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
   2096   { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
   2097   { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
   2098   { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
   2099   { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
   2100   { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
   2101   { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
   2102   { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
   2103   { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
   2104   { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
   2105   { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
   2106   { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
   2107   /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
   2108   { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
   2109   { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
   2110   { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
   2111   { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
   2112   { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
   2113   { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
   2114   { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
   2115   { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
   2116   { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
   2117   { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
   2118   { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
   2119   { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
   2120   { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
   2121   { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
   2122   { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 }
   2123 };
   2124 
   2125 static const struct elf_reloc_map mips16_reloc_map[] =
   2126 {
   2127   { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
   2128   { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
   2129   { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
   2130   { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
   2131   { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
   2132   { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
   2133 };
   2134 
   2135 /* Given a BFD reloc type, return a howto structure.  */
   2136 
   2137 static reloc_howto_type *
   2138 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   2139 				 bfd_reloc_code_real_type code)
   2140 {
   2141   unsigned int i;
   2142   /* FIXME: We default to RELA here instead of choosing the right
   2143      relocation variant.  */
   2144   reloc_howto_type *howto_table = elf_mips_howto_table_rela;
   2145   reloc_howto_type *howto16_table = elf_mips16_howto_table_rela;
   2146 
   2147   for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
   2148        i++)
   2149     {
   2150       if (mips_reloc_map[i].bfd_val == code)
   2151 	return &howto_table[(int) mips_reloc_map[i].elf_val];
   2152     }
   2153 
   2154   for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
   2155        i++)
   2156     {
   2157       if (mips16_reloc_map[i].bfd_val == code)
   2158 	return &howto16_table[(int) mips16_reloc_map[i].elf_val];
   2159     }
   2160 
   2161   switch (code)
   2162     {
   2163     case BFD_RELOC_VTABLE_INHERIT:
   2164       return &elf_mips_gnu_vtinherit_howto;
   2165     case BFD_RELOC_VTABLE_ENTRY:
   2166       return &elf_mips_gnu_vtentry_howto;
   2167     case BFD_RELOC_MIPS_COPY:
   2168       return &elf_mips_copy_howto;
   2169     case BFD_RELOC_MIPS_JUMP_SLOT:
   2170       return &elf_mips_jump_slot_howto;
   2171     default:
   2172       bfd_set_error (bfd_error_bad_value);
   2173       return NULL;
   2174     }
   2175 }
   2176 
   2177 static reloc_howto_type *
   2178 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   2179 				 const char *r_name)
   2180 {
   2181   unsigned int i;
   2182 
   2183   for (i = 0;
   2184        i < (sizeof (elf_mips_howto_table_rela)
   2185 	    / sizeof (elf_mips_howto_table_rela[0]));
   2186        i++)
   2187     if (elf_mips_howto_table_rela[i].name != NULL
   2188 	&& strcasecmp (elf_mips_howto_table_rela[i].name, r_name) == 0)
   2189       return &elf_mips_howto_table_rela[i];
   2190 
   2191   for (i = 0;
   2192        i < (sizeof (elf_mips16_howto_table_rela)
   2193 	    / sizeof (elf_mips16_howto_table_rela[0]));
   2194        i++)
   2195     if (elf_mips16_howto_table_rela[i].name != NULL
   2196 	&& strcasecmp (elf_mips16_howto_table_rela[i].name, r_name) == 0)
   2197       return &elf_mips16_howto_table_rela[i];
   2198 
   2199   if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
   2200     return &elf_mips_gnu_vtinherit_howto;
   2201   if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
   2202     return &elf_mips_gnu_vtentry_howto;
   2203   if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
   2204     return &elf_mips_gnu_rel16_s2;
   2205   if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
   2206     return &elf_mips_gnu_rela16_s2;
   2207   if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
   2208     return &elf_mips_copy_howto;
   2209   if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
   2210     return &elf_mips_jump_slot_howto;
   2211 
   2212   return NULL;
   2213 }
   2214 
   2215 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
   2216 
   2217 static reloc_howto_type *
   2218 mips_elf_n32_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
   2219 {
   2220   switch (r_type)
   2221     {
   2222     case R_MIPS_GNU_VTINHERIT:
   2223       return &elf_mips_gnu_vtinherit_howto;
   2224     case R_MIPS_GNU_VTENTRY:
   2225       return &elf_mips_gnu_vtentry_howto;
   2226     case R_MIPS_GNU_REL16_S2:
   2227       if (rela_p)
   2228 	return &elf_mips_gnu_rela16_s2;
   2229       else
   2230 	return &elf_mips_gnu_rel16_s2;
   2231     case R_MIPS_COPY:
   2232       return &elf_mips_copy_howto;
   2233     case R_MIPS_JUMP_SLOT:
   2234       return &elf_mips_jump_slot_howto;
   2235     default:
   2236       if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
   2237 	{
   2238 	  if (rela_p)
   2239 	    return &elf_mips16_howto_table_rela[r_type - R_MIPS16_min];
   2240 	  else
   2241 	    return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
   2242 	}
   2243       BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
   2244       if (rela_p)
   2245 	return &elf_mips_howto_table_rela[r_type];
   2246       else
   2247 	return &elf_mips_howto_table_rel[r_type];
   2248       break;
   2249     }
   2250 }
   2251 
   2252 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
   2253 
   2254 static void
   2255 mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
   2256 {
   2257   unsigned int r_type;
   2258 
   2259   r_type = ELF32_R_TYPE (dst->r_info);
   2260   cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, FALSE);
   2261 
   2262   /* The addend for a GPREL16 or LITERAL relocation comes from the GP
   2263      value for the object file.  We get the addend now, rather than
   2264      when we do the relocation, because the symbol manipulations done
   2265      by the linker may cause us to lose track of the input BFD.  */
   2266   if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
   2267       && (gprel16_reloc_p (r_type) || r_type == (unsigned int) R_MIPS_LITERAL))
   2268     cache_ptr->addend = elf_gp (abfd);
   2269 }
   2270 
   2271 /* Given a MIPS Elf_Internal_Rela, fill in an arelent structure.  */
   2272 
   2273 static void
   2274 mips_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
   2275 			 arelent *cache_ptr, Elf_Internal_Rela *dst)
   2276 {
   2277   unsigned int r_type;
   2278 
   2279   r_type = ELF32_R_TYPE (dst->r_info);
   2280   cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, TRUE);
   2281   cache_ptr->addend = dst->r_addend;
   2282 }
   2283 
   2284 /* Determine whether a symbol is global for the purposes of splitting
   2286    the symbol table into global symbols and local symbols.  At least
   2287    on Irix 5, this split must be between section symbols and all other
   2288    symbols.  On most ELF targets the split is between static symbols
   2289    and externally visible symbols.  */
   2290 
   2291 static bfd_boolean
   2292 mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
   2293 {
   2294   if (SGI_COMPAT (abfd))
   2295     return (sym->flags & BSF_SECTION_SYM) == 0;
   2296   else
   2297     return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
   2298 	    || bfd_is_und_section (bfd_get_section (sym))
   2299 	    || bfd_is_com_section (bfd_get_section (sym)));
   2300 }
   2301 
   2302 /* Set the right machine number for a MIPS ELF file.  */
   2304 
   2305 static bfd_boolean
   2306 mips_elf_n32_object_p (bfd *abfd)
   2307 {
   2308   unsigned long mach;
   2309 
   2310   /* Irix 5 and 6 are broken.  Object file symbol tables are not always
   2311      sorted correctly such that local symbols precede global symbols,
   2312      and the sh_info field in the symbol table is not always right.  */
   2313   if (SGI_COMPAT (abfd))
   2314     elf_bad_symtab (abfd) = TRUE;
   2315 
   2316   mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
   2317   bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
   2318 
   2319   if (! ABI_N32_P(abfd))
   2320     return FALSE;
   2321 
   2322   return TRUE;
   2323 }
   2324 
   2325 /* Support for core dump NOTE sections.  */
   2327 static bfd_boolean
   2328 elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
   2329 {
   2330   int offset;
   2331   unsigned int size;
   2332 
   2333   switch (note->descsz)
   2334     {
   2335       default:
   2336 	return FALSE;
   2337 
   2338       case 440:		/* Linux/MIPS N32 */
   2339 	/* pr_cursig */
   2340 	elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
   2341 
   2342 	/* pr_pid */
   2343 	elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
   2344 
   2345 	/* pr_reg */
   2346 	offset = 72;
   2347 	size = 360;
   2348 
   2349 	break;
   2350     }
   2351 
   2352   /* Make a ".reg/999" section.  */
   2353   return _bfd_elfcore_make_pseudosection (abfd, ".reg", size,
   2354 					  note->descpos + offset);
   2355 }
   2356 
   2357 static bfd_boolean
   2358 elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
   2359 {
   2360   switch (note->descsz)
   2361     {
   2362       default:
   2363 	return FALSE;
   2364 
   2365       case 128:		/* Linux/MIPS elf_prpsinfo */
   2366 	elf_tdata (abfd)->core_program
   2367 	 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
   2368 	elf_tdata (abfd)->core_command
   2369 	 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
   2370     }
   2371 
   2372   /* Note that for some reason, a spurious space is tacked
   2373      onto the end of the args in some (at least one anyway)
   2374      implementations, so strip it off if it exists.  */
   2375 
   2376   {
   2377     char *command = elf_tdata (abfd)->core_command;
   2378     int n = strlen (command);
   2379 
   2380     if (0 < n && command[n - 1] == ' ')
   2381       command[n - 1] = '\0';
   2382   }
   2383 
   2384   return TRUE;
   2385 }
   2386 
   2387 /* Depending on the target vector we generate some version of Irix
   2389    executables or "normal" MIPS ELF ABI executables.  */
   2390 static irix_compat_t
   2391 elf_n32_mips_irix_compat (bfd *abfd)
   2392 {
   2393   if ((abfd->xvec == &bfd_elf32_nbigmips_vec)
   2394       || (abfd->xvec == &bfd_elf32_nlittlemips_vec))
   2395     return ict_irix6;
   2396   else
   2397     return ict_none;
   2398 }
   2399 
   2400 /* ECOFF swapping routines.  These are used when dealing with the
   2402    .mdebug section, which is in the ECOFF debugging format.  */
   2403 static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
   2404   /* Symbol table magic number.  */
   2405   magicSym,
   2406   /* Alignment of debugging information.  E.g., 4.  */
   2407   4,
   2408   /* Sizes of external symbolic information.  */
   2409   sizeof (struct hdr_ext),
   2410   sizeof (struct dnr_ext),
   2411   sizeof (struct pdr_ext),
   2412   sizeof (struct sym_ext),
   2413   sizeof (struct opt_ext),
   2414   sizeof (struct fdr_ext),
   2415   sizeof (struct rfd_ext),
   2416   sizeof (struct ext_ext),
   2417   /* Functions to swap in external symbolic data.  */
   2418   ecoff_swap_hdr_in,
   2419   ecoff_swap_dnr_in,
   2420   ecoff_swap_pdr_in,
   2421   ecoff_swap_sym_in,
   2422   ecoff_swap_opt_in,
   2423   ecoff_swap_fdr_in,
   2424   ecoff_swap_rfd_in,
   2425   ecoff_swap_ext_in,
   2426   _bfd_ecoff_swap_tir_in,
   2427   _bfd_ecoff_swap_rndx_in,
   2428   /* Functions to swap out external symbolic data.  */
   2429   ecoff_swap_hdr_out,
   2430   ecoff_swap_dnr_out,
   2431   ecoff_swap_pdr_out,
   2432   ecoff_swap_sym_out,
   2433   ecoff_swap_opt_out,
   2434   ecoff_swap_fdr_out,
   2435   ecoff_swap_rfd_out,
   2436   ecoff_swap_ext_out,
   2437   _bfd_ecoff_swap_tir_out,
   2438   _bfd_ecoff_swap_rndx_out,
   2439   /* Function to read in symbolic data.  */
   2440   _bfd_mips_elf_read_ecoff_info
   2441 };
   2442 
   2443 #define ELF_ARCH			bfd_arch_mips
   2445 #define ELF_TARGET_ID			MIPS_ELF_DATA
   2446 #define ELF_MACHINE_CODE		EM_MIPS
   2447 
   2448 #define elf_backend_collect		TRUE
   2449 #define elf_backend_type_change_ok	TRUE
   2450 #define elf_backend_can_gc_sections	TRUE
   2451 #define elf_info_to_howto		mips_info_to_howto_rela
   2452 #define elf_info_to_howto_rel		mips_info_to_howto_rel
   2453 #define elf_backend_sym_is_global	mips_elf_sym_is_global
   2454 #define elf_backend_object_p		mips_elf_n32_object_p
   2455 #define elf_backend_symbol_processing	_bfd_mips_elf_symbol_processing
   2456 #define elf_backend_section_processing	_bfd_mips_elf_section_processing
   2457 #define elf_backend_section_from_shdr	_bfd_mips_elf_section_from_shdr
   2458 #define elf_backend_fake_sections	_bfd_mips_elf_fake_sections
   2459 #define elf_backend_section_from_bfd_section \
   2460 					_bfd_mips_elf_section_from_bfd_section
   2461 #define elf_backend_add_symbol_hook	_bfd_mips_elf_add_symbol_hook
   2462 #define elf_backend_link_output_symbol_hook \
   2463 					_bfd_mips_elf_link_output_symbol_hook
   2464 #define elf_backend_create_dynamic_sections \
   2465 					_bfd_mips_elf_create_dynamic_sections
   2466 #define elf_backend_check_relocs	_bfd_mips_elf_check_relocs
   2467 #define elf_backend_merge_symbol_attribute \
   2468 					_bfd_mips_elf_merge_symbol_attribute
   2469 #define elf_backend_get_target_dtag	_bfd_mips_elf_get_target_dtag
   2470 #define elf_backend_adjust_dynamic_symbol \
   2471 					_bfd_mips_elf_adjust_dynamic_symbol
   2472 #define elf_backend_always_size_sections \
   2473 					_bfd_mips_elf_always_size_sections
   2474 #define elf_backend_size_dynamic_sections \
   2475 					_bfd_mips_elf_size_dynamic_sections
   2476 #define elf_backend_init_index_section	_bfd_elf_init_1_index_section
   2477 #define elf_backend_relocate_section	_bfd_mips_elf_relocate_section
   2478 #define elf_backend_finish_dynamic_symbol \
   2479 					_bfd_mips_elf_finish_dynamic_symbol
   2480 #define elf_backend_finish_dynamic_sections \
   2481 					_bfd_mips_elf_finish_dynamic_sections
   2482 #define elf_backend_final_write_processing \
   2483 					_bfd_mips_elf_final_write_processing
   2484 #define elf_backend_additional_program_headers \
   2485 					_bfd_mips_elf_additional_program_headers
   2486 #define elf_backend_modify_segment_map	_bfd_mips_elf_modify_segment_map
   2487 #define elf_backend_gc_mark_hook	_bfd_mips_elf_gc_mark_hook
   2488 #define elf_backend_gc_sweep_hook	_bfd_mips_elf_gc_sweep_hook
   2489 #define elf_backend_copy_indirect_symbol \
   2490 					_bfd_mips_elf_copy_indirect_symbol
   2491 #define elf_backend_grok_prstatus	elf32_mips_grok_prstatus
   2492 #define elf_backend_grok_psinfo		elf32_mips_grok_psinfo
   2493 #define elf_backend_ecoff_debug_swap	&mips_elf32_ecoff_debug_swap
   2494 
   2495 #define elf_backend_got_header_size	(4 * MIPS_RESERVED_GOTNO)
   2496 
   2497 /* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations
   2498    work better/work only in RELA, so we default to this.  */
   2499 #define elf_backend_may_use_rel_p	1
   2500 #define elf_backend_may_use_rela_p	1
   2501 #define elf_backend_default_use_rela_p	1
   2502 #define elf_backend_rela_plts_and_copies_p 0
   2503 #define elf_backend_sign_extend_vma	TRUE
   2504 #define elf_backend_plt_readonly	1
   2505 #define elf_backend_plt_sym_val		_bfd_mips_elf_plt_sym_val
   2506 
   2507 #define elf_backend_discard_info	_bfd_mips_elf_discard_info
   2508 #define elf_backend_ignore_discarded_relocs \
   2509 					_bfd_mips_elf_ignore_discarded_relocs
   2510 #define elf_backend_write_section	_bfd_mips_elf_write_section
   2511 #define elf_backend_mips_irix_compat	elf_n32_mips_irix_compat
   2512 #define elf_backend_mips_rtype_to_howto	mips_elf_n32_rtype_to_howto
   2513 #define bfd_elf32_find_nearest_line	_bfd_mips_elf_find_nearest_line
   2514 #define bfd_elf32_find_inliner_info	_bfd_mips_elf_find_inliner_info
   2515 #define bfd_elf32_new_section_hook	_bfd_mips_elf_new_section_hook
   2516 #define bfd_elf32_set_section_contents	_bfd_mips_elf_set_section_contents
   2517 #define bfd_elf32_bfd_get_relocated_section_contents \
   2518 				_bfd_elf_mips_get_relocated_section_contents
   2519 #define bfd_elf32_bfd_link_hash_table_create \
   2520 					_bfd_mips_elf_link_hash_table_create
   2521 #define bfd_elf32_bfd_final_link	_bfd_mips_elf_final_link
   2522 #define bfd_elf32_bfd_merge_private_bfd_data \
   2523 					_bfd_mips_elf_merge_private_bfd_data
   2524 #define bfd_elf32_bfd_set_private_flags	_bfd_mips_elf_set_private_flags
   2525 #define bfd_elf32_bfd_print_private_bfd_data \
   2526 					_bfd_mips_elf_print_private_bfd_data
   2527 #define bfd_elf32_bfd_relax_section     _bfd_mips_relax_section
   2528 
   2529 /* Support for SGI-ish mips targets using n32 ABI.  */
   2530 
   2531 #define TARGET_LITTLE_SYM               bfd_elf32_nlittlemips_vec
   2532 #define TARGET_LITTLE_NAME              "elf32-nlittlemips"
   2533 #define TARGET_BIG_SYM                  bfd_elf32_nbigmips_vec
   2534 #define TARGET_BIG_NAME                 "elf32-nbigmips"
   2535 
   2536 #define ELF_MAXPAGESIZE			0x10000
   2537 #define ELF_COMMONPAGESIZE		0x1000
   2538 
   2539 #include "elf32-target.h"
   2540 
   2541 /* Support for traditional mips targets using n32 ABI.  */
   2542 #undef TARGET_LITTLE_SYM
   2543 #undef TARGET_LITTLE_NAME
   2544 #undef TARGET_BIG_SYM
   2545 #undef TARGET_BIG_NAME
   2546 
   2547 #undef ELF_MAXPAGESIZE
   2548 #undef ELF_COMMONPAGESIZE
   2549 
   2550 #define TARGET_LITTLE_SYM               bfd_elf32_ntradlittlemips_vec
   2551 #define TARGET_LITTLE_NAME              "elf32-ntradlittlemips"
   2552 #define TARGET_BIG_SYM                  bfd_elf32_ntradbigmips_vec
   2553 #define TARGET_BIG_NAME                 "elf32-ntradbigmips"
   2554 
   2555 #define ELF_MAXPAGESIZE			0x10000
   2556 #define ELF_COMMONPAGESIZE		0x1000
   2557 #define elf32_bed			elf32_tradbed
   2558 
   2559 /* Include the target file again for this target.  */
   2560 #include "elf32-target.h"
   2561 
   2562 
   2563 /* FreeBSD support.  */
   2564 
   2565 #undef TARGET_LITTLE_SYM
   2566 #undef TARGET_LITTLE_NAME
   2567 #undef TARGET_BIG_SYM
   2568 #undef TARGET_BIG_NAME
   2569 
   2570 #define	TARGET_LITTLE_SYM		bfd_elf32_ntradlittlemips_freebsd_vec
   2571 #define	TARGET_LITTLE_NAME		"elf32-ntradlittlemips-freebsd"
   2572 #define	TARGET_BIG_SYM			bfd_elf32_ntradbigmips_freebsd_vec
   2573 #define	TARGET_BIG_NAME			"elf32-ntradbigmips-freebsd"
   2574 
   2575 #undef	ELF_OSABI
   2576 #define	ELF_OSABI			ELFOSABI_FREEBSD
   2577 
   2578 /* The kernel recognizes executables as valid only if they carry a
   2579    "FreeBSD" label in the ELF header.  So we put this label on all
   2580    executables and (for simplicity) also all other object files.  */
   2581 
   2582 static void
   2583 elf_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
   2584 {
   2585   _bfd_elf_set_osabi (abfd, info);
   2586 }
   2587 
   2588 #undef	elf_backend_post_process_headers
   2589 #define	elf_backend_post_process_headers	elf_fbsd_post_process_headers
   2590 #undef	elf32_bed
   2591 #define elf32_bed				elf32_fbsd_tradbed
   2592 
   2593 #include "elf32-target.h"
   2594