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