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