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