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