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