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