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