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