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