1/* MIPS-specific support for 32-bit ELF
2   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3   2003, 2004, 2005, 2007 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
52static bfd_boolean mips_elf_assign_gp
53  (bfd *, bfd_vma *);
54static bfd_reloc_status_type mips_elf_final_gp
55  (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
56static bfd_reloc_status_type mips_elf_gprel16_reloc
57  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
58static bfd_reloc_status_type mips_elf_literal_reloc
59  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
60static bfd_reloc_status_type mips_elf_gprel32_reloc
61  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
62static bfd_reloc_status_type gprel32_with_gp
63  (bfd *, asymbol *, arelent *, asection *, bfd_boolean, void *, bfd_vma);
64static bfd_reloc_status_type mips_elf_shift6_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  /* 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
778static 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	 TRUE,			/* 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	 TRUE,			/* 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	 TRUE,			/* 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	 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_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	 TRUE,			/* 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	 TRUE,			/* 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	 TRUE,			/* 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	 TRUE,			/* 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	 TRUE,			/* 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	 TRUE,			/* 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
1464static 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 placeholder for MIPS16 reference to global offset table.  */
1500  EMPTY_HOWTO (R_MIPS16_GOT16),
1501
1502  /* A placeholder for MIPS16 16 bit call through global offset table.  */
1503  EMPTY_HOWTO (R_MIPS16_CALL16),
1504
1505  /* MIPS16 high 16 bits of symbol value.  */
1506  HOWTO (R_MIPS16_HI16,		/* type */
1507	 16,			/* rightshift */
1508	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1509	 16,			/* bitsize */
1510	 FALSE,			/* pc_relative */
1511	 0,			/* bitpos */
1512	 complain_overflow_dont, /* complain_on_overflow */
1513	 _bfd_mips_elf_hi16_reloc, /* special_function */
1514	 "R_MIPS16_HI16",	/* name */
1515	 TRUE,			/* partial_inplace */
1516	 0x0000ffff,		/* src_mask */
1517	 0x0000ffff,		/* dst_mask */
1518	 FALSE),		/* pcrel_offset */
1519
1520  /* MIPS16 low 16 bits of symbol value.  */
1521  HOWTO (R_MIPS16_LO16,		/* type */
1522	 0,			/* rightshift */
1523	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1524	 16,			/* bitsize */
1525	 FALSE,			/* pc_relative */
1526	 0,			/* bitpos */
1527	 complain_overflow_dont, /* complain_on_overflow */
1528	 _bfd_mips_elf_lo16_reloc, /* special_function */
1529	 "R_MIPS16_LO16",	/* name */
1530	 TRUE,			/* partial_inplace */
1531	 0x0000ffff,		/* src_mask */
1532	 0x0000ffff,		/* dst_mask */
1533	 FALSE),		/* pcrel_offset */
1534};
1535
1536static reloc_howto_type elf_mips16_howto_table_rela[] =
1537{
1538  /* The reloc used for the mips16 jump instruction.  */
1539  HOWTO (R_MIPS16_26,		/* type */
1540	 2,			/* rightshift */
1541	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1542	 26,			/* bitsize */
1543	 FALSE,			/* pc_relative */
1544	 0,			/* bitpos */
1545	 complain_overflow_dont, /* complain_on_overflow */
1546	 			/* This needs complex overflow
1547				   detection, because the upper four
1548				   bits must match the PC.  */
1549	 _bfd_mips_elf_generic_reloc, /* special_function */
1550	 "R_MIPS16_26",		/* name */
1551	 FALSE,			/* partial_inplace */
1552	 0x3ffffff,		/* src_mask */
1553	 0x3ffffff,		/* dst_mask */
1554	 FALSE),		/* pcrel_offset */
1555
1556  /* The reloc used for the mips16 gprel instruction.  */
1557  HOWTO (R_MIPS16_GPREL,	/* type */
1558	 0,			/* rightshift */
1559	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1560	 16,			/* bitsize */
1561	 FALSE,			/* pc_relative */
1562	 0,			/* bitpos */
1563	 complain_overflow_signed, /* complain_on_overflow */
1564	 mips16_gprel_reloc,	/* special_function */
1565	 "R_MIPS16_GPREL",	/* name */
1566	 FALSE,			/* partial_inplace */
1567	 0x0000ffff,		/* src_mask */
1568	 0x0000ffff,	        /* dst_mask */
1569	 FALSE),		/* pcrel_offset */
1570
1571  /* A placeholder for MIPS16 reference to global offset table.  */
1572  EMPTY_HOWTO (R_MIPS16_GOT16),
1573
1574  /* A placeholder for MIPS16 16 bit call through global offset table.  */
1575  EMPTY_HOWTO (R_MIPS16_CALL16),
1576
1577  /* MIPS16 high 16 bits of symbol value.  */
1578  HOWTO (R_MIPS16_HI16,		/* type */
1579	 16,			/* rightshift */
1580	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1581	 16,			/* bitsize */
1582	 FALSE,			/* pc_relative */
1583	 0,			/* bitpos */
1584	 complain_overflow_dont, /* complain_on_overflow */
1585	 _bfd_mips_elf_hi16_reloc, /* special_function */
1586	 "R_MIPS16_HI16",	/* name */
1587	 FALSE,			/* partial_inplace */
1588	 0x0000ffff,		/* src_mask */
1589	 0x0000ffff,		/* dst_mask */
1590	 FALSE),		/* pcrel_offset */
1591
1592  /* MIPS16 low 16 bits of symbol value.  */
1593  HOWTO (R_MIPS16_LO16,		/* type */
1594	 0,			/* rightshift */
1595	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1596	 16,			/* bitsize */
1597	 FALSE,			/* pc_relative */
1598	 0,			/* bitpos */
1599	 complain_overflow_dont, /* complain_on_overflow */
1600	 _bfd_mips_elf_lo16_reloc, /* special_function */
1601	 "R_MIPS16_LO16",	/* name */
1602	 FALSE,			/* partial_inplace */
1603	 0x0000ffff,		/* src_mask */
1604	 0x0000ffff,		/* dst_mask */
1605	 FALSE),		/* pcrel_offset */
1606};
1607
1608/* GNU extension to record C++ vtable hierarchy */
1609static reloc_howto_type elf_mips_gnu_vtinherit_howto =
1610  HOWTO (R_MIPS_GNU_VTINHERIT,	/* type */
1611	 0,			/* rightshift */
1612	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1613	 0,			/* bitsize */
1614	 FALSE,			/* pc_relative */
1615	 0,			/* bitpos */
1616	 complain_overflow_dont, /* complain_on_overflow */
1617	 NULL,			/* special_function */
1618	 "R_MIPS_GNU_VTINHERIT", /* name */
1619	 FALSE,			/* partial_inplace */
1620	 0,			/* src_mask */
1621	 0,			/* dst_mask */
1622	 FALSE);		/* pcrel_offset */
1623
1624/* GNU extension to record C++ vtable member usage */
1625static reloc_howto_type elf_mips_gnu_vtentry_howto =
1626  HOWTO (R_MIPS_GNU_VTENTRY,	/* type */
1627	 0,			/* rightshift */
1628	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1629	 0,			/* bitsize */
1630	 FALSE,			/* pc_relative */
1631	 0,			/* bitpos */
1632	 complain_overflow_dont, /* complain_on_overflow */
1633	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
1634	 "R_MIPS_GNU_VTENTRY",	/* name */
1635	 FALSE,			/* partial_inplace */
1636	 0,			/* src_mask */
1637	 0,			/* dst_mask */
1638	 FALSE);		/* pcrel_offset */
1639
1640/* 16 bit offset for pc-relative branches.  */
1641static reloc_howto_type elf_mips_gnu_rel16_s2 =
1642  HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
1643	 2,			/* rightshift */
1644	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1645	 16,			/* bitsize */
1646	 TRUE,			/* pc_relative */
1647	 0,			/* bitpos */
1648	 complain_overflow_signed, /* complain_on_overflow */
1649	 _bfd_mips_elf_generic_reloc, /* special_function */
1650	 "R_MIPS_GNU_REL16_S2",	/* name */
1651	 TRUE,			/* partial_inplace */
1652	 0x0000ffff,		/* src_mask */
1653	 0x0000ffff,		/* dst_mask */
1654	 TRUE);			/* pcrel_offset */
1655
1656/* 16 bit offset for pc-relative branches.  */
1657static reloc_howto_type elf_mips_gnu_rela16_s2 =
1658  HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
1659	 2,			/* rightshift */
1660	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1661	 16,			/* bitsize */
1662	 TRUE,			/* pc_relative */
1663	 0,			/* bitpos */
1664	 complain_overflow_signed, /* complain_on_overflow */
1665	 _bfd_mips_elf_generic_reloc, /* special_function */
1666	 "R_MIPS_GNU_REL16_S2",	/* name */
1667	 FALSE,			/* partial_inplace */
1668	 0,			/* src_mask */
1669	 0x0000ffff,		/* dst_mask */
1670	 TRUE);			/* pcrel_offset */
1671
1672/* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
1673   dangerous relocation.  */
1674
1675static bfd_boolean
1676mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
1677{
1678  unsigned int count;
1679  asymbol **sym;
1680  unsigned int i;
1681
1682  /* If we've already figured out what GP will be, just return it.  */
1683  *pgp = _bfd_get_gp_value (output_bfd);
1684  if (*pgp)
1685    return TRUE;
1686
1687  count = bfd_get_symcount (output_bfd);
1688  sym = bfd_get_outsymbols (output_bfd);
1689
1690  /* The linker script will have created a symbol named `_gp' with the
1691     appropriate value.  */
1692  if (sym == NULL)
1693    i = count;
1694  else
1695    {
1696      for (i = 0; i < count; i++, sym++)
1697	{
1698	  register const char *name;
1699
1700	  name = bfd_asymbol_name (*sym);
1701	  if (*name == '_' && strcmp (name, "_gp") == 0)
1702	    {
1703	      *pgp = bfd_asymbol_value (*sym);
1704	      _bfd_set_gp_value (output_bfd, *pgp);
1705	      break;
1706	    }
1707	}
1708    }
1709
1710  if (i >= count)
1711    {
1712      /* Only get the error once.  */
1713      *pgp = 4;
1714      _bfd_set_gp_value (output_bfd, *pgp);
1715      return FALSE;
1716    }
1717
1718  return TRUE;
1719}
1720
1721/* We have to figure out the gp value, so that we can adjust the
1722   symbol value correctly.  We look up the symbol _gp in the output
1723   BFD.  If we can't find it, we're stuck.  We cache it in the ELF
1724   target data.  We don't need to adjust the symbol value for an
1725   external symbol if we are producing relocatable output.  */
1726
1727static bfd_reloc_status_type
1728mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
1729		   char **error_message, bfd_vma *pgp)
1730{
1731  if (bfd_is_und_section (symbol->section)
1732      && ! relocatable)
1733    {
1734      *pgp = 0;
1735      return bfd_reloc_undefined;
1736    }
1737
1738  *pgp = _bfd_get_gp_value (output_bfd);
1739  if (*pgp == 0
1740      && (! relocatable
1741	  || (symbol->flags & BSF_SECTION_SYM) != 0))
1742    {
1743      if (relocatable)
1744	{
1745	  /* Make up a value.  */
1746	  *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
1747	  _bfd_set_gp_value (output_bfd, *pgp);
1748	}
1749      else if (!mips_elf_assign_gp (output_bfd, pgp))
1750	{
1751	  *error_message =
1752	    (char *) _("GP relative relocation when _gp not defined");
1753	  return bfd_reloc_dangerous;
1754	}
1755    }
1756
1757  return bfd_reloc_ok;
1758}
1759
1760/* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
1761   become the offset from the gp register.  */
1762
1763static bfd_reloc_status_type
1764mips_elf_gprel16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
1765			asymbol *symbol, void *data ATTRIBUTE_UNUSED,
1766			asection *input_section, bfd *output_bfd,
1767			char **error_message ATTRIBUTE_UNUSED)
1768{
1769  bfd_boolean relocatable;
1770  bfd_reloc_status_type ret;
1771  bfd_vma gp;
1772
1773  if (output_bfd != NULL)
1774    relocatable = TRUE;
1775  else
1776    {
1777      relocatable = FALSE;
1778      output_bfd = symbol->section->output_section->owner;
1779    }
1780
1781  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
1782			   &gp);
1783  if (ret != bfd_reloc_ok)
1784    return ret;
1785
1786  return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1787					input_section, relocatable,
1788					data, gp);
1789}
1790
1791/* Do a R_MIPS_LITERAL relocation.  */
1792
1793static bfd_reloc_status_type
1794mips_elf_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1795			void *data, asection *input_section, bfd *output_bfd,
1796			char **error_message)
1797{
1798  bfd_boolean relocatable;
1799  bfd_reloc_status_type ret;
1800  bfd_vma gp;
1801
1802  /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
1803  if (output_bfd != NULL
1804      && (symbol->flags & BSF_SECTION_SYM) == 0
1805      && (symbol->flags & BSF_LOCAL) != 0)
1806    {
1807      *error_message = (char *)
1808	_("literal relocation occurs for an external symbol");
1809      return bfd_reloc_outofrange;
1810    }
1811
1812  /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
1813  if (output_bfd != NULL)
1814    relocatable = TRUE;
1815  else
1816    {
1817      relocatable = FALSE;
1818      output_bfd = symbol->section->output_section->owner;
1819    }
1820
1821  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
1822			   &gp);
1823  if (ret != bfd_reloc_ok)
1824    return ret;
1825
1826  return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1827					input_section, relocatable,
1828					data, gp);
1829}
1830
1831/* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
1832   become the offset from the gp register.  */
1833
1834static bfd_reloc_status_type
1835mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1836			void *data, asection *input_section, bfd *output_bfd,
1837			char **error_message)
1838{
1839  bfd_boolean relocatable;
1840  bfd_reloc_status_type ret;
1841  bfd_vma gp;
1842
1843  /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
1844  if (output_bfd != NULL
1845      && (symbol->flags & BSF_SECTION_SYM) == 0
1846      && (symbol->flags & BSF_LOCAL) != 0)
1847    {
1848      *error_message = (char *)
1849	_("32bits gp relative relocation occurs for an external symbol");
1850      return bfd_reloc_outofrange;
1851    }
1852
1853  if (output_bfd != NULL)
1854    {
1855      relocatable = TRUE;
1856      gp = _bfd_get_gp_value (output_bfd);
1857    }
1858  else
1859    {
1860      relocatable = FALSE;
1861      output_bfd = symbol->section->output_section->owner;
1862
1863      ret = mips_elf_final_gp (output_bfd, symbol, relocatable,
1864			       error_message, &gp);
1865      if (ret != bfd_reloc_ok)
1866	return ret;
1867    }
1868
1869  return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
1870			  relocatable, data, gp);
1871}
1872
1873static bfd_reloc_status_type
1874gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry,
1875		 asection *input_section, bfd_boolean relocatable,
1876		 void *data, bfd_vma gp)
1877{
1878  bfd_vma relocation;
1879  unsigned long val;
1880
1881  if (bfd_is_com_section (symbol->section))
1882    relocation = 0;
1883  else
1884    relocation = symbol->value;
1885
1886  relocation += symbol->section->output_section->vma;
1887  relocation += symbol->section->output_offset;
1888
1889  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1890    return bfd_reloc_outofrange;
1891
1892  if (reloc_entry->howto->src_mask == 0)
1893    val = 0;
1894  else
1895    val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1896
1897  /* Set val to the offset into the section or symbol.  */
1898  val += reloc_entry->addend;
1899
1900  /* Adjust val for the final section location and GP value.  If we
1901     are producing relocatable output, we don't want to do this for
1902     an external symbol.  */
1903  if (! relocatable
1904      || (symbol->flags & BSF_SECTION_SYM) != 0)
1905    val += relocation - gp;
1906
1907  bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
1908
1909  if (relocatable)
1910    reloc_entry->address += input_section->output_offset;
1911
1912  return bfd_reloc_ok;
1913}
1914
1915/* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
1916   the rest is at bits 6-10. The bitpos already got right by the howto.  */
1917
1918static bfd_reloc_status_type
1919mips_elf_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1920		       void *data, asection *input_section, bfd *output_bfd,
1921		       char **error_message)
1922{
1923  if (reloc_entry->howto->partial_inplace)
1924    {
1925      reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
1926			     | (reloc_entry->addend & 0x00000800) >> 9);
1927    }
1928
1929  return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1930				      input_section, output_bfd,
1931				      error_message);
1932}
1933
1934/* Handle a mips16 GP relative reloc.  */
1935
1936static bfd_reloc_status_type
1937mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1938		    void *data, asection *input_section, bfd *output_bfd,
1939		    char **error_message)
1940{
1941  bfd_boolean relocatable;
1942  bfd_reloc_status_type ret;
1943  bfd_byte *location;
1944  bfd_vma gp;
1945
1946  /* If we're relocating, and this is an external symbol, we don't want
1947     to change anything.  */
1948  if (output_bfd != NULL
1949      && (symbol->flags & BSF_SECTION_SYM) == 0
1950      && (symbol->flags & BSF_LOCAL) != 0)
1951    {
1952      reloc_entry->address += input_section->output_offset;
1953      return bfd_reloc_ok;
1954    }
1955
1956  if (output_bfd != NULL)
1957    relocatable = TRUE;
1958  else
1959    {
1960      relocatable = FALSE;
1961      output_bfd = symbol->section->output_section->owner;
1962    }
1963
1964  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
1965			   &gp);
1966  if (ret != bfd_reloc_ok)
1967    return ret;
1968
1969  location = (bfd_byte *) data + reloc_entry->address;
1970  _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
1971				   location);
1972  ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1973				       input_section, relocatable,
1974				       data, gp);
1975  _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
1976				 location);
1977
1978  return ret;
1979}
1980
1981/* A mapping from BFD reloc types to MIPS ELF reloc types.  */
1982
1983struct elf_reloc_map {
1984  bfd_reloc_code_real_type bfd_val;
1985  enum elf_mips_reloc_type elf_val;
1986};
1987
1988static const struct elf_reloc_map mips_reloc_map[] =
1989{
1990  { BFD_RELOC_NONE, R_MIPS_NONE },
1991  { BFD_RELOC_16, R_MIPS_16 },
1992  { BFD_RELOC_32, R_MIPS_32 },
1993  /* There is no BFD reloc for R_MIPS_REL32.  */
1994  { BFD_RELOC_CTOR, R_MIPS_32 },
1995  { BFD_RELOC_64, R_MIPS_64 },
1996  { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
1997  { BFD_RELOC_HI16_S, R_MIPS_HI16 },
1998  { BFD_RELOC_LO16, R_MIPS_LO16 },
1999  { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
2000  { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
2001  { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
2002  { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
2003  { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
2004  { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
2005  { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
2006  { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
2007  { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
2008  { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
2009  { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
2010  { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
2011  { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
2012  { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
2013  { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
2014  { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
2015  { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
2016  { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
2017  { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
2018  { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
2019  { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
2020  { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
2021  { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
2022  /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
2023  { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
2024  { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
2025  { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
2026  { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
2027  { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
2028  { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
2029  { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
2030  { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
2031  { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
2032  { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
2033  { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
2034  { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
2035  { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
2036  { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
2037  { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 }
2038};
2039
2040static const struct elf_reloc_map mips16_reloc_map[] =
2041{
2042  { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
2043  { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
2044  { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
2045  { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
2046};
2047
2048/* Given a BFD reloc type, return a howto structure.  */
2049
2050static reloc_howto_type *
2051bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2052				 bfd_reloc_code_real_type code)
2053{
2054  unsigned int i;
2055  /* FIXME: We default to RELA here instead of choosing the right
2056     relocation variant.  */
2057  reloc_howto_type *howto_table = elf_mips_howto_table_rela;
2058  reloc_howto_type *howto16_table = elf_mips16_howto_table_rela;
2059
2060  for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
2061       i++)
2062    {
2063      if (mips_reloc_map[i].bfd_val == code)
2064	return &howto_table[(int) mips_reloc_map[i].elf_val];
2065    }
2066
2067  for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
2068       i++)
2069    {
2070      if (mips16_reloc_map[i].bfd_val == code)
2071	return &howto16_table[(int) mips16_reloc_map[i].elf_val];
2072    }
2073
2074  switch (code)
2075    {
2076    case BFD_RELOC_VTABLE_INHERIT:
2077      return &elf_mips_gnu_vtinherit_howto;
2078    case BFD_RELOC_VTABLE_ENTRY:
2079      return &elf_mips_gnu_vtentry_howto;
2080    default:
2081      bfd_set_error (bfd_error_bad_value);
2082      return NULL;
2083    }
2084}
2085
2086static reloc_howto_type *
2087bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2088				 const char *r_name)
2089{
2090  unsigned int i;
2091
2092  for (i = 0;
2093       i < (sizeof (elf_mips_howto_table_rela)
2094	    / sizeof (elf_mips_howto_table_rela[0]));
2095       i++)
2096    if (elf_mips_howto_table_rela[i].name != NULL
2097	&& strcasecmp (elf_mips_howto_table_rela[i].name, r_name) == 0)
2098      return &elf_mips_howto_table_rela[i];
2099
2100  for (i = 0;
2101       i < (sizeof (elf_mips16_howto_table_rela)
2102	    / sizeof (elf_mips16_howto_table_rela[0]));
2103       i++)
2104    if (elf_mips16_howto_table_rela[i].name != NULL
2105	&& strcasecmp (elf_mips16_howto_table_rela[i].name, r_name) == 0)
2106      return &elf_mips16_howto_table_rela[i];
2107
2108  if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
2109    return &elf_mips_gnu_vtinherit_howto;
2110  if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
2111    return &elf_mips_gnu_vtentry_howto;
2112  if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
2113    return &elf_mips_gnu_rel16_s2;
2114  if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
2115    return &elf_mips_gnu_rela16_s2;
2116
2117  return NULL;
2118}
2119
2120/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
2121
2122static reloc_howto_type *
2123mips_elf_n32_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
2124{
2125  switch (r_type)
2126    {
2127    case R_MIPS_GNU_VTINHERIT:
2128      return &elf_mips_gnu_vtinherit_howto;
2129    case R_MIPS_GNU_VTENTRY:
2130      return &elf_mips_gnu_vtentry_howto;
2131    case R_MIPS_GNU_REL16_S2:
2132      if (rela_p)
2133	return &elf_mips_gnu_rela16_s2;
2134      else
2135	return &elf_mips_gnu_rel16_s2;
2136    default:
2137      if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
2138	{
2139	  if (rela_p)
2140	    return &elf_mips16_howto_table_rela[r_type - R_MIPS16_min];
2141	  else
2142	    return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
2143	}
2144      BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
2145      if (rela_p)
2146	return &elf_mips_howto_table_rela[r_type];
2147      else
2148	return &elf_mips_howto_table_rel[r_type];
2149      break;
2150    }
2151}
2152
2153/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
2154
2155static void
2156mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
2157{
2158  unsigned int r_type;
2159
2160  r_type = ELF32_R_TYPE (dst->r_info);
2161  cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, FALSE);
2162
2163  /* The addend for a GPREL16 or LITERAL relocation comes from the GP
2164     value for the object file.  We get the addend now, rather than
2165     when we do the relocation, because the symbol manipulations done
2166     by the linker may cause us to lose track of the input BFD.  */
2167  if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
2168      && (r_type == (unsigned int) R_MIPS_GPREL16
2169	  || r_type == (unsigned int) R_MIPS_LITERAL))
2170    cache_ptr->addend = elf_gp (abfd);
2171}
2172
2173/* Given a MIPS Elf_Internal_Rela, fill in an arelent structure.  */
2174
2175static void
2176mips_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
2177			 arelent *cache_ptr, Elf_Internal_Rela *dst)
2178{
2179  unsigned int r_type;
2180
2181  r_type = ELF32_R_TYPE (dst->r_info);
2182  cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, TRUE);
2183  cache_ptr->addend = dst->r_addend;
2184}
2185
2186/* Determine whether a symbol is global for the purposes of splitting
2187   the symbol table into global symbols and local symbols.  At least
2188   on Irix 5, this split must be between section symbols and all other
2189   symbols.  On most ELF targets the split is between static symbols
2190   and externally visible symbols.  */
2191
2192static bfd_boolean
2193mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
2194{
2195  if (SGI_COMPAT (abfd))
2196    return (sym->flags & BSF_SECTION_SYM) == 0;
2197  else
2198    return ((sym->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
2199	    || bfd_is_und_section (bfd_get_section (sym))
2200	    || bfd_is_com_section (bfd_get_section (sym)));
2201}
2202
2203/* Set the right machine number for a MIPS ELF file.  */
2204
2205static bfd_boolean
2206mips_elf_n32_object_p (bfd *abfd)
2207{
2208  unsigned long mach;
2209
2210  /* Irix 5 and 6 are broken.  Object file symbol tables are not always
2211     sorted correctly such that local symbols precede global symbols,
2212     and the sh_info field in the symbol table is not always right.  */
2213  if (SGI_COMPAT (abfd))
2214    elf_bad_symtab (abfd) = TRUE;
2215
2216  mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
2217  bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
2218
2219  if (! ABI_N32_P(abfd))
2220    return FALSE;
2221
2222  return TRUE;
2223}
2224
2225/* Support for core dump NOTE sections.  */
2226static bfd_boolean
2227elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2228{
2229  int offset;
2230  unsigned int size;
2231
2232  switch (note->descsz)
2233    {
2234      default:
2235	return FALSE;
2236
2237      case 440:		/* Linux/MIPS N32 */
2238	/* pr_cursig */
2239	elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2240
2241	/* pr_pid */
2242	elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
2243
2244	/* pr_reg */
2245	offset = 72;
2246	size = 360;
2247
2248	break;
2249    }
2250
2251  /* Make a ".reg/999" section.  */
2252  return _bfd_elfcore_make_pseudosection (abfd, ".reg", size,
2253					  note->descpos + offset);
2254}
2255
2256static bfd_boolean
2257elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2258{
2259  switch (note->descsz)
2260    {
2261      default:
2262	return FALSE;
2263
2264      case 128:		/* Linux/MIPS elf_prpsinfo */
2265	elf_tdata (abfd)->core_program
2266	 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
2267	elf_tdata (abfd)->core_command
2268	 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
2269    }
2270
2271  /* Note that for some reason, a spurious space is tacked
2272     onto the end of the args in some (at least one anyway)
2273     implementations, so strip it off if it exists.  */
2274
2275  {
2276    char *command = elf_tdata (abfd)->core_command;
2277    int n = strlen (command);
2278
2279    if (0 < n && command[n - 1] == ' ')
2280      command[n - 1] = '\0';
2281  }
2282
2283  return TRUE;
2284}
2285
2286/* Depending on the target vector we generate some version of Irix
2287   executables or "normal" MIPS ELF ABI executables.  */
2288static irix_compat_t
2289elf_n32_mips_irix_compat (bfd *abfd)
2290{
2291  if ((abfd->xvec == &bfd_elf32_nbigmips_vec)
2292      || (abfd->xvec == &bfd_elf32_nlittlemips_vec))
2293    return ict_irix6;
2294  else
2295    return ict_none;
2296}
2297
2298/* ECOFF swapping routines.  These are used when dealing with the
2299   .mdebug section, which is in the ECOFF debugging format.  */
2300static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
2301  /* Symbol table magic number.  */
2302  magicSym,
2303  /* Alignment of debugging information.  E.g., 4.  */
2304  4,
2305  /* Sizes of external symbolic information.  */
2306  sizeof (struct hdr_ext),
2307  sizeof (struct dnr_ext),
2308  sizeof (struct pdr_ext),
2309  sizeof (struct sym_ext),
2310  sizeof (struct opt_ext),
2311  sizeof (struct fdr_ext),
2312  sizeof (struct rfd_ext),
2313  sizeof (struct ext_ext),
2314  /* Functions to swap in external symbolic data.  */
2315  ecoff_swap_hdr_in,
2316  ecoff_swap_dnr_in,
2317  ecoff_swap_pdr_in,
2318  ecoff_swap_sym_in,
2319  ecoff_swap_opt_in,
2320  ecoff_swap_fdr_in,
2321  ecoff_swap_rfd_in,
2322  ecoff_swap_ext_in,
2323  _bfd_ecoff_swap_tir_in,
2324  _bfd_ecoff_swap_rndx_in,
2325  /* Functions to swap out external symbolic data.  */
2326  ecoff_swap_hdr_out,
2327  ecoff_swap_dnr_out,
2328  ecoff_swap_pdr_out,
2329  ecoff_swap_sym_out,
2330  ecoff_swap_opt_out,
2331  ecoff_swap_fdr_out,
2332  ecoff_swap_rfd_out,
2333  ecoff_swap_ext_out,
2334  _bfd_ecoff_swap_tir_out,
2335  _bfd_ecoff_swap_rndx_out,
2336  /* Function to read in symbolic data.  */
2337  _bfd_mips_elf_read_ecoff_info
2338};
2339
2340#define ELF_ARCH			bfd_arch_mips
2341#define ELF_MACHINE_CODE		EM_MIPS
2342
2343#define elf_backend_collect		TRUE
2344#define elf_backend_type_change_ok	TRUE
2345#define elf_backend_can_gc_sections	TRUE
2346#define elf_info_to_howto		mips_info_to_howto_rela
2347#define elf_info_to_howto_rel		mips_info_to_howto_rel
2348#define elf_backend_sym_is_global	mips_elf_sym_is_global
2349#define elf_backend_object_p		mips_elf_n32_object_p
2350#define elf_backend_symbol_processing	_bfd_mips_elf_symbol_processing
2351#define elf_backend_section_processing	_bfd_mips_elf_section_processing
2352#define elf_backend_section_from_shdr	_bfd_mips_elf_section_from_shdr
2353#define elf_backend_fake_sections	_bfd_mips_elf_fake_sections
2354#define elf_backend_section_from_bfd_section \
2355					_bfd_mips_elf_section_from_bfd_section
2356#define elf_backend_add_symbol_hook	_bfd_mips_elf_add_symbol_hook
2357#define elf_backend_link_output_symbol_hook \
2358					_bfd_mips_elf_link_output_symbol_hook
2359#define elf_backend_create_dynamic_sections \
2360					_bfd_mips_elf_create_dynamic_sections
2361#define elf_backend_check_relocs	_bfd_mips_elf_check_relocs
2362#define elf_backend_merge_symbol_attribute \
2363					_bfd_mips_elf_merge_symbol_attribute
2364#define elf_backend_adjust_dynamic_symbol \
2365					_bfd_mips_elf_adjust_dynamic_symbol
2366#define elf_backend_always_size_sections \
2367					_bfd_mips_elf_always_size_sections
2368#define elf_backend_size_dynamic_sections \
2369					_bfd_mips_elf_size_dynamic_sections
2370#define elf_backend_init_index_section	_bfd_elf_init_1_index_section
2371#define elf_backend_relocate_section	_bfd_mips_elf_relocate_section
2372#define elf_backend_finish_dynamic_symbol \
2373					_bfd_mips_elf_finish_dynamic_symbol
2374#define elf_backend_finish_dynamic_sections \
2375					_bfd_mips_elf_finish_dynamic_sections
2376#define elf_backend_final_write_processing \
2377					_bfd_mips_elf_final_write_processing
2378#define elf_backend_additional_program_headers \
2379					_bfd_mips_elf_additional_program_headers
2380#define elf_backend_modify_segment_map	_bfd_mips_elf_modify_segment_map
2381#define elf_backend_gc_mark_hook	_bfd_mips_elf_gc_mark_hook
2382#define elf_backend_gc_sweep_hook	_bfd_mips_elf_gc_sweep_hook
2383#define elf_backend_copy_indirect_symbol \
2384					_bfd_mips_elf_copy_indirect_symbol
2385#define elf_backend_hide_symbol		_bfd_mips_elf_hide_symbol
2386#define elf_backend_grok_prstatus	elf32_mips_grok_prstatus
2387#define elf_backend_grok_psinfo		elf32_mips_grok_psinfo
2388#define elf_backend_ecoff_debug_swap	&mips_elf32_ecoff_debug_swap
2389
2390#define elf_backend_got_header_size	(4 * MIPS_RESERVED_GOTNO)
2391
2392/* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations
2393   work better/work only in RELA, so we default to this.  */
2394#define elf_backend_may_use_rel_p	1
2395#define elf_backend_may_use_rela_p	1
2396#define elf_backend_default_use_rela_p	1
2397#define elf_backend_sign_extend_vma	TRUE
2398
2399#define elf_backend_discard_info	_bfd_mips_elf_discard_info
2400#define elf_backend_ignore_discarded_relocs \
2401					_bfd_mips_elf_ignore_discarded_relocs
2402#define elf_backend_write_section	_bfd_mips_elf_write_section
2403#define elf_backend_mips_irix_compat	elf_n32_mips_irix_compat
2404#define elf_backend_mips_rtype_to_howto	mips_elf_n32_rtype_to_howto
2405#define bfd_elf32_find_nearest_line	_bfd_mips_elf_find_nearest_line
2406#define bfd_elf32_find_inliner_info	_bfd_mips_elf_find_inliner_info
2407#define bfd_elf32_new_section_hook	_bfd_mips_elf_new_section_hook
2408#define bfd_elf32_set_section_contents	_bfd_mips_elf_set_section_contents
2409#define bfd_elf32_bfd_get_relocated_section_contents \
2410				_bfd_elf_mips_get_relocated_section_contents
2411#define bfd_elf32_bfd_link_hash_table_create \
2412					_bfd_mips_elf_link_hash_table_create
2413#define bfd_elf32_bfd_final_link	_bfd_mips_elf_final_link
2414#define bfd_elf32_bfd_merge_private_bfd_data \
2415					_bfd_mips_elf_merge_private_bfd_data
2416#define bfd_elf32_bfd_set_private_flags	_bfd_mips_elf_set_private_flags
2417#define bfd_elf32_bfd_print_private_bfd_data \
2418					_bfd_mips_elf_print_private_bfd_data
2419#define bfd_elf32_bfd_relax_section     _bfd_mips_relax_section
2420
2421/* Support for SGI-ish mips targets using n32 ABI.  */
2422
2423#define TARGET_LITTLE_SYM               bfd_elf32_nlittlemips_vec
2424#define TARGET_LITTLE_NAME              "elf32-nlittlemips"
2425#define TARGET_BIG_SYM                  bfd_elf32_nbigmips_vec
2426#define TARGET_BIG_NAME                 "elf32-nbigmips"
2427
2428#define ELF_MAXPAGESIZE			0x10000
2429#define ELF_COMMONPAGESIZE		0x1000
2430
2431#include "elf32-target.h"
2432
2433/* Support for traditional mips targets using n32 ABI.  */
2434#undef TARGET_LITTLE_SYM
2435#undef TARGET_LITTLE_NAME
2436#undef TARGET_BIG_SYM
2437#undef TARGET_BIG_NAME
2438
2439#undef ELF_MAXPAGESIZE
2440#undef ELF_COMMONPAGESIZE
2441
2442#define TARGET_LITTLE_SYM               bfd_elf32_ntradlittlemips_vec
2443#define TARGET_LITTLE_NAME              "elf32-ntradlittlemips"
2444#define TARGET_BIG_SYM                  bfd_elf32_ntradbigmips_vec
2445#define TARGET_BIG_NAME                 "elf32-ntradbigmips"
2446
2447#define ELF_MAXPAGESIZE			0x10000
2448#define ELF_COMMONPAGESIZE		0x1000
2449#define elf32_bed			elf32_tradbed
2450
2451/* Include the target file again for this target.  */
2452#include "elf32-target.h"
2453