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