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