* elf64-mips.c (elf_mips_gnu_rel16_s2): Add internally used
[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 /* 16 bit offset for pc-relative branches.  */
1203 static reloc_howto_type elf_mips_gnu_rel16_s2 =
1204   HOWTO (R_MIPS_GNU_REL16_S2,   /* type */
1205          2,                     /* rightshift */
1206          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1207          16,                    /* bitsize */
1208          TRUE,                  /* pc_relative */
1209          0,                     /* bitpos */
1210          complain_overflow_signed, /* complain_on_overflow */
1211          mips_elf_generic_reloc, /* special_function */
1212          "R_MIPS_GNU_REL16_S2", /* name */
1213          TRUE,                  /* partial_inplace */
1214          0x0000ffff,            /* src_mask */
1215          0x0000ffff,            /* dst_mask */
1216          TRUE);                 /* pcrel_offset */
1217
1218 /* 16 bit offset for pc-relative branches.  */
1219 static reloc_howto_type elf_mips_gnu_rela16_s2 =
1220   HOWTO (R_MIPS_GNU_REL16_S2,   /* type */
1221          2,                     /* rightshift */
1222          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1223          16,                    /* bitsize */
1224          TRUE,                  /* pc_relative */
1225          0,                     /* bitpos */
1226          complain_overflow_signed, /* complain_on_overflow */
1227          mips_elf_generic_reloc, /* special_function */
1228          "R_MIPS_GNU_REL16_S2", /* name */
1229          FALSE,                 /* partial_inplace */
1230          0,                     /* src_mask */
1231          0x0000ffff,            /* dst_mask */
1232          TRUE);                 /* pcrel_offset */
1233 \f
1234 /* This is derived from bfd_elf_generic_reloc.  NewABI allows us to have
1235    several relocations against the same address.  The addend is derived
1236    from the addends of preceding relocations.  If we don't need to
1237    do something special,  we simply keep track of the addend.  */
1238
1239 #define GET_RELOC_ADDEND(obfd, sym, entry, sec)                         \
1240 {                                                                       \
1241   /* If we're relocating, and this is an external symbol, we don't      \
1242      want to change anything.  */                                       \
1243     if ((obfd) != (bfd *) NULL                                          \
1244         && ((sym)->flags & BSF_SECTION_SYM) == 0                        \
1245         && (! (entry)->howto->partial_inplace                           \
1246             || (entry)->addend == 0))                                   \
1247       {                                                                 \
1248         (entry)->address += (sec)->output_offset;                       \
1249         return bfd_reloc_ok;                                            \
1250       }                                                                 \
1251                                                                         \
1252     /* The addend of combined relocs is remembered and left for         \
1253        subsequent relocs.  */                                           \
1254     if (prev_reloc_address != (entry)->address                          \
1255         || prev_reloc_section != (sec))                                 \
1256       {                                                                 \
1257         prev_reloc_section = (sec);                                     \
1258         prev_reloc_address = (entry)->address;                          \
1259         prev_reloc_addend = (entry)->addend;                            \
1260       }                                                                 \
1261     else                                                                \
1262       (entry)->addend = prev_reloc_addend;                              \
1263 }
1264
1265 #define SET_RELOC_ADDEND(entry)                                         \
1266 {                                                                       \
1267   prev_reloc_addend = (entry)->addend;                                  \
1268 }
1269
1270 static bfd_reloc_status_type
1271 mips_elf_generic_reloc (abfd, reloc_entry, symbol, data, input_section,
1272                         output_bfd, error_message)
1273      bfd *abfd ATTRIBUTE_UNUSED;
1274      arelent *reloc_entry;
1275      asymbol *symbol;
1276      PTR data ATTRIBUTE_UNUSED;
1277      asection *input_section;
1278      bfd *output_bfd;
1279      char **error_message ATTRIBUTE_UNUSED;
1280 {
1281   GET_RELOC_ADDEND (output_bfd, symbol, reloc_entry, input_section)
1282
1283   return bfd_reloc_continue;
1284 }
1285 \f
1286 /* Do a R_MIPS_HI16 relocation.  This has to be done in combination
1287    with a R_MIPS_LO16 reloc, because there is a carry from the LO16 to
1288    the HI16.  Here we just save the information we need; we do the
1289    actual relocation when we see the LO16.
1290
1291    MIPS ELF requires that the LO16 immediately follow the HI16.  As a
1292    GNU extension, for non-pc-relative relocations, we permit an
1293    arbitrary number of HI16 relocs to be associated with a single LO16
1294    reloc.  This extension permits gcc to output the HI and LO relocs
1295    itself.
1296
1297    This cannot be done for PC-relative relocations because both the HI16
1298    and LO16 parts of the relocations must be done relative to the LO16
1299    part, and there can be carry to or borrow from the HI16 part.  */
1300
1301 struct mips_hi16
1302 {
1303   struct mips_hi16 *next;
1304   bfd_byte *addr;
1305   bfd_vma addend;
1306 };
1307
1308 /* FIXME: This should not be a static variable.  */
1309
1310 static struct mips_hi16 *mips_hi16_list;
1311
1312 static bfd_reloc_status_type
1313 mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data, input_section,
1314                      output_bfd, error_message)
1315      bfd *abfd ATTRIBUTE_UNUSED;
1316      arelent *reloc_entry;
1317      asymbol *symbol;
1318      PTR data;
1319      asection *input_section;
1320      bfd *output_bfd;
1321      char **error_message ATTRIBUTE_UNUSED;
1322 {
1323   bfd_reloc_status_type ret;
1324   bfd_vma relocation;
1325   struct mips_hi16 *n;
1326
1327   GET_RELOC_ADDEND (output_bfd, symbol, reloc_entry, input_section)
1328
1329   ret = bfd_reloc_ok;
1330
1331   if (bfd_is_und_section (symbol->section) && output_bfd == (bfd *) NULL)
1332     ret = bfd_reloc_undefined;
1333
1334   if (bfd_is_com_section (symbol->section))
1335     relocation = 0;
1336   else
1337     relocation = symbol->value;
1338
1339   relocation += symbol->section->output_section->vma;
1340   relocation += symbol->section->output_offset;
1341   relocation += reloc_entry->addend;
1342
1343   if (reloc_entry->address > input_section->_cooked_size)
1344     return bfd_reloc_outofrange;
1345
1346   /* Save the information, and let LO16 do the actual relocation.  */
1347   n = (struct mips_hi16 *) bfd_malloc ((bfd_size_type) sizeof *n);
1348   if (n == NULL)
1349     return bfd_reloc_outofrange;
1350   n->addr = (bfd_byte *) data + reloc_entry->address;
1351   n->addend = relocation;
1352   n->next = mips_hi16_list;
1353   mips_hi16_list = n;
1354
1355   if (output_bfd != (bfd *) NULL)
1356     reloc_entry->address += input_section->output_offset;
1357
1358   return ret;
1359 }
1360
1361 /* Do a R_MIPS_LO16 relocation.  This is a straightforward 16 bit
1362    inplace relocation; this function exists in order to do the
1363    R_MIPS_HI16 relocation described above.  */
1364
1365 static bfd_reloc_status_type
1366 mips_elf_lo16_reloc (abfd, reloc_entry, symbol, data, input_section,
1367                      output_bfd, error_message)
1368      bfd *abfd;
1369      arelent *reloc_entry;
1370      asymbol *symbol;
1371      PTR data;
1372      asection *input_section;
1373      bfd *output_bfd;
1374      char **error_message;
1375 {
1376   if (mips_hi16_list != NULL)
1377     {
1378       struct mips_hi16 *l;
1379
1380       l = mips_hi16_list;
1381       while (l != NULL)
1382         {
1383           unsigned long insn;
1384           unsigned long val;
1385           unsigned long vallo;
1386           struct mips_hi16 *next;
1387
1388           /* Do the HI16 relocation.  Note that we actually don't need
1389              to know anything about the LO16 itself, except where to
1390              find the low 16 bits of the addend needed by the LO16.  */
1391           insn = bfd_get_32 (abfd, l->addr);
1392           vallo = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1393
1394           /* The low order 16 bits are always treated as a signed
1395              value.  */
1396           vallo = ((vallo & 0xffff) ^ 0x8000) - 0x8000;
1397           val = ((insn & 0xffff) << 16) + vallo;
1398           val += l->addend;
1399
1400           /* If PC-relative, we need to subtract out the address of the LO
1401              half of the HI/LO.  (The actual relocation is relative
1402              to that instruction.)  */
1403           if (reloc_entry->howto->pc_relative)
1404             val -= reloc_entry->address;
1405
1406           /* At this point, "val" has the value of the combined HI/LO
1407              pair.  If the low order 16 bits (which will be used for
1408              the LO16 insn) are negative, then we will need an
1409              adjustment for the high order 16 bits.  */
1410           val += 0x8000;
1411           val = (val >> 16) & 0xffff;
1412
1413           insn &= ~ (bfd_vma) 0xffff;
1414           insn |= val;
1415           bfd_put_32 (abfd, (bfd_vma) insn, l->addr);
1416
1417           next = l->next;
1418           free (l);
1419           l = next;
1420         }
1421
1422       mips_hi16_list = NULL;
1423     }
1424
1425   /* Now do the LO16 reloc in the usual way.  */
1426   return mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1427                                  input_section, output_bfd, error_message);
1428 }
1429
1430 /* Do a R_MIPS_GOT16 reloc.  This is a reloc against the global offset
1431    table used for PIC code.  If the symbol is an external symbol, the
1432    instruction is modified to contain the offset of the appropriate
1433    entry in the global offset table.  If the symbol is a section
1434    symbol, the next reloc is a R_MIPS_LO16 reloc.  The two 16 bit
1435    addends are combined to form the real addend against the section
1436    symbol; the GOT16 is modified to contain the offset of an entry in
1437    the global offset table, and the LO16 is modified to offset it
1438    appropriately.  Thus an offset larger than 16 bits requires a
1439    modified value in the global offset table.
1440
1441    This implementation suffices for the assembler, but the linker does
1442    not yet know how to create global offset tables.  */
1443
1444 static bfd_reloc_status_type
1445 mips_elf_got16_reloc (abfd, reloc_entry, symbol, data, input_section,
1446                       output_bfd, error_message)
1447      bfd *abfd;
1448      arelent *reloc_entry;
1449      asymbol *symbol;
1450      PTR data;
1451      asection *input_section;
1452      bfd *output_bfd;
1453      char **error_message;
1454 {
1455   /* If we're relocating, and this is a local symbol, we can handle it
1456      just like HI16.  */
1457   if (output_bfd != (bfd *) NULL
1458       && (symbol->flags & BSF_SECTION_SYM) != 0)
1459     return mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
1460                                 input_section, output_bfd, error_message);
1461
1462   /* Otherwise we try to handle it as R_MIPS_GOT_DISP.  */
1463   return mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1464                                  input_section, output_bfd, error_message);
1465 }
1466
1467 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
1468    dangerous relocation.  */
1469
1470 static bfd_boolean
1471 mips_elf_assign_gp (output_bfd, pgp)
1472      bfd *output_bfd;
1473      bfd_vma *pgp;
1474 {
1475   unsigned int count;
1476   asymbol **sym;
1477   unsigned int i;
1478
1479   /* If we've already figured out what GP will be, just return it.  */
1480   *pgp = _bfd_get_gp_value (output_bfd);
1481   if (*pgp)
1482     return TRUE;
1483
1484   count = bfd_get_symcount (output_bfd);
1485   sym = bfd_get_outsymbols (output_bfd);
1486
1487   /* The linker script will have created a symbol named `_gp' with the
1488      appropriate value.  */
1489   if (sym == (asymbol **) NULL)
1490     i = count;
1491   else
1492     {
1493       for (i = 0; i < count; i++, sym++)
1494         {
1495           register const char *name;
1496
1497           name = bfd_asymbol_name (*sym);
1498           if (*name == '_' && strcmp (name, "_gp") == 0)
1499             {
1500               *pgp = bfd_asymbol_value (*sym);
1501               _bfd_set_gp_value (output_bfd, *pgp);
1502               break;
1503             }
1504         }
1505     }
1506
1507   if (i >= count)
1508     {
1509       /* Only get the error once.  */
1510       *pgp = 4;
1511       _bfd_set_gp_value (output_bfd, *pgp);
1512       return FALSE;
1513     }
1514
1515   return TRUE;
1516 }
1517
1518 /* We have to figure out the gp value, so that we can adjust the
1519    symbol value correctly.  We look up the symbol _gp in the output
1520    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
1521    target data.  We don't need to adjust the symbol value for an
1522    external symbol if we are producing relocateable output.  */
1523
1524 static bfd_reloc_status_type
1525 mips_elf_final_gp (output_bfd, symbol, relocateable, error_message, pgp)
1526      bfd *output_bfd;
1527      asymbol *symbol;
1528      bfd_boolean relocateable;
1529      char **error_message;
1530      bfd_vma *pgp;
1531 {
1532   if (bfd_is_und_section (symbol->section)
1533       && ! relocateable)
1534     {
1535       *pgp = 0;
1536       return bfd_reloc_undefined;
1537     }
1538
1539   *pgp = _bfd_get_gp_value (output_bfd);
1540   if (*pgp == 0
1541       && (! relocateable
1542           || (symbol->flags & BSF_SECTION_SYM) != 0))
1543     {
1544       if (relocateable)
1545         {
1546           /* Make up a value.  */
1547           *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
1548           _bfd_set_gp_value (output_bfd, *pgp);
1549         }
1550       else if (!mips_elf_assign_gp (output_bfd, pgp))
1551         {
1552           *error_message =
1553             (char *) _("GP relative relocation when _gp not defined");
1554           return bfd_reloc_dangerous;
1555         }
1556     }
1557
1558   return bfd_reloc_ok;
1559 }
1560
1561 /* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
1562    become the offset from the gp register.  */
1563
1564 static bfd_reloc_status_type
1565 mips_elf_gprel16_reloc (abfd, reloc_entry, symbol, data, input_section,
1566                         output_bfd, error_message)
1567      bfd *abfd ATTRIBUTE_UNUSED;
1568      arelent *reloc_entry;
1569      asymbol *symbol;
1570      PTR data ATTRIBUTE_UNUSED;
1571      asection *input_section;
1572      bfd *output_bfd;
1573      char **error_message ATTRIBUTE_UNUSED;
1574 {
1575   bfd_boolean relocateable;
1576   bfd_reloc_status_type ret;
1577   bfd_vma gp;
1578
1579   GET_RELOC_ADDEND (output_bfd, symbol, reloc_entry, input_section)
1580
1581   if (output_bfd != (bfd *) NULL)
1582     relocateable = TRUE;
1583   else
1584     {
1585       relocateable = FALSE;
1586       output_bfd = symbol->section->output_section->owner;
1587     }
1588
1589   ret = mips_elf_final_gp (output_bfd, symbol, relocateable, error_message,
1590                            &gp);
1591   if (ret != bfd_reloc_ok)
1592     return ret;
1593
1594   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1595                                         input_section, relocateable,
1596                                         data, gp);
1597 }
1598
1599 /* Do a R_MIPS_LITERAL relocation.  */
1600
1601 static bfd_reloc_status_type
1602 mips_elf_literal_reloc (abfd, reloc_entry, symbol, data, input_section,
1603                         output_bfd, error_message)
1604      bfd *abfd;
1605      arelent *reloc_entry;
1606      asymbol *symbol;
1607      PTR data;
1608      asection *input_section;
1609      bfd *output_bfd;
1610      char **error_message;
1611 {
1612   bfd_boolean relocateable;
1613   bfd_reloc_status_type ret;
1614   bfd_vma gp;
1615
1616   GET_RELOC_ADDEND (output_bfd, symbol, reloc_entry, input_section)
1617
1618   /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
1619   if (output_bfd != (bfd *) NULL)
1620     relocateable = TRUE;
1621   else
1622     {
1623       relocateable = FALSE;
1624       output_bfd = symbol->section->output_section->owner;
1625     }
1626
1627   ret = mips_elf_final_gp (output_bfd, symbol, relocateable, error_message,
1628                            &gp);
1629   if (ret != bfd_reloc_ok)
1630     return ret;
1631
1632   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1633                                         input_section, relocateable,
1634                                         data, gp);
1635 }
1636
1637 /* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
1638    become the offset from the gp register.  */
1639
1640 static bfd_reloc_status_type
1641 mips_elf_gprel32_reloc (abfd, reloc_entry, symbol, data, input_section,
1642                         output_bfd, error_message)
1643      bfd *abfd;
1644      arelent *reloc_entry;
1645      asymbol *symbol;
1646      PTR data;
1647      asection *input_section;
1648      bfd *output_bfd;
1649      char **error_message;
1650 {
1651   bfd_boolean relocateable;
1652   bfd_reloc_status_type ret;
1653   bfd_vma gp;
1654
1655   GET_RELOC_ADDEND (output_bfd, symbol, reloc_entry, input_section)
1656
1657   /* R_MIPS_GPREL32 relocations are defined for local symbols only.
1658      We will only have an addend if this is a newly created reloc,
1659      not read from an ELF file.  */
1660   if (output_bfd != (bfd *) NULL
1661       && (symbol->flags & BSF_SECTION_SYM) == 0
1662       && reloc_entry->addend == 0)
1663     {
1664       *error_message = (char *)
1665         _("32bits gp relative relocation occurs for an external symbol");
1666       return bfd_reloc_outofrange;
1667     }
1668
1669   if (output_bfd != (bfd *) NULL)
1670     {
1671       relocateable = TRUE;
1672       gp = _bfd_get_gp_value (output_bfd);
1673     }
1674   else
1675     {
1676       relocateable = FALSE;
1677       output_bfd = symbol->section->output_section->owner;
1678
1679       ret = mips_elf_final_gp (output_bfd, symbol, relocateable,
1680                                error_message, &gp);
1681       if (ret != bfd_reloc_ok)
1682         return ret;
1683     }
1684
1685   return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
1686                           relocateable, data, gp);
1687 }
1688
1689 static bfd_reloc_status_type
1690 gprel32_with_gp (abfd, symbol, reloc_entry, input_section, relocateable, data,
1691                  gp)
1692      bfd *abfd;
1693      asymbol *symbol;
1694      arelent *reloc_entry;
1695      asection *input_section;
1696      bfd_boolean relocateable;
1697      PTR data;
1698      bfd_vma gp;
1699 {
1700   bfd_vma relocation;
1701   unsigned long val;
1702
1703   if (bfd_is_com_section (symbol->section))
1704     relocation = 0;
1705   else
1706     relocation = symbol->value;
1707
1708   relocation += symbol->section->output_section->vma;
1709   relocation += symbol->section->output_offset;
1710
1711   if (reloc_entry->address > input_section->_cooked_size)
1712     return bfd_reloc_outofrange;
1713
1714   if (reloc_entry->howto->src_mask == 0)
1715     val = 0;
1716   else
1717     val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1718
1719   /* Set val to the offset into the section or symbol.  */
1720   val += reloc_entry->addend;
1721
1722   /* Adjust val for the final section location and GP value.  If we
1723      are producing relocateable output, we don't want to do this for
1724      an external symbol.  */
1725   if (! relocateable
1726       || (symbol->flags & BSF_SECTION_SYM) != 0)
1727     val += relocation - gp;
1728
1729   bfd_put_32 (abfd, (bfd_vma) val, (bfd_byte *) data + reloc_entry->address);
1730
1731   if (relocateable)
1732     reloc_entry->address += input_section->output_offset;
1733
1734   return bfd_reloc_ok;
1735 }
1736
1737 /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
1738    the rest is at bits 6-10. The bitpos already got right by the howto.  */
1739
1740 static bfd_reloc_status_type
1741 mips_elf_shift6_reloc (abfd, reloc_entry, symbol, data, input_section,
1742                        output_bfd, error_message)
1743      bfd *abfd ATTRIBUTE_UNUSED;
1744      arelent *reloc_entry;
1745      asymbol *symbol;
1746      PTR data ATTRIBUTE_UNUSED;
1747      asection *input_section;
1748      bfd *output_bfd;
1749      char **error_message ATTRIBUTE_UNUSED;
1750 {
1751   GET_RELOC_ADDEND (output_bfd, symbol, reloc_entry, input_section)
1752
1753   reloc_entry->addend = (reloc_entry->addend & 0x00007c0)
1754                         | (reloc_entry->addend & 0x00000800) >> 9;
1755
1756   SET_RELOC_ADDEND (reloc_entry)
1757
1758   return bfd_reloc_continue;
1759 }
1760 \f
1761 /* Handle a mips16 jump.  */
1762
1763 static bfd_reloc_status_type
1764 mips16_jump_reloc (abfd, reloc_entry, symbol, data, input_section,
1765                    output_bfd, error_message)
1766      bfd *abfd ATTRIBUTE_UNUSED;
1767      arelent *reloc_entry;
1768      asymbol *symbol;
1769      PTR data ATTRIBUTE_UNUSED;
1770      asection *input_section;
1771      bfd *output_bfd;
1772      char **error_message ATTRIBUTE_UNUSED;
1773 {
1774   static bfd_boolean warned = FALSE;
1775
1776   GET_RELOC_ADDEND (output_bfd, symbol, reloc_entry, input_section)
1777
1778   /* FIXME.  */
1779   if (! warned)
1780     (*_bfd_error_handler)
1781       (_("Linking mips16 objects into %s format is not supported"),
1782        bfd_get_target (input_section->output_section->owner));
1783   warned = TRUE;
1784
1785   return bfd_reloc_undefined;
1786 }
1787
1788 /* Handle a mips16 GP relative reloc.  */
1789
1790 static bfd_reloc_status_type
1791 mips16_gprel_reloc (abfd, reloc_entry, symbol, data, input_section,
1792                     output_bfd, error_message)
1793      bfd *abfd;
1794      arelent *reloc_entry;
1795      asymbol *symbol;
1796      PTR data;
1797      asection *input_section;
1798      bfd *output_bfd;
1799      char **error_message;
1800 {
1801   bfd_boolean relocateable;
1802   bfd_reloc_status_type ret;
1803   bfd_vma gp;
1804   unsigned short extend, insn;
1805   unsigned long final;
1806
1807   GET_RELOC_ADDEND (output_bfd, symbol, reloc_entry, input_section)
1808
1809   if (output_bfd != NULL)
1810     relocateable = TRUE;
1811   else
1812     {
1813       relocateable = FALSE;
1814       output_bfd = symbol->section->output_section->owner;
1815     }
1816
1817   ret = mips_elf_final_gp (output_bfd, symbol, relocateable, error_message,
1818                            &gp);
1819   if (ret != bfd_reloc_ok)
1820     return ret;
1821
1822   if (reloc_entry->address > input_section->_cooked_size)
1823     return bfd_reloc_outofrange;
1824
1825   /* Pick up the mips16 extend instruction and the real instruction.  */
1826   extend = bfd_get_16 (abfd, (bfd_byte *) data + reloc_entry->address);
1827   insn = bfd_get_16 (abfd, (bfd_byte *) data + reloc_entry->address + 2);
1828
1829   /* Stuff the current addend back as a 32 bit value, do the usual
1830      relocation, and then clean up.  */
1831   bfd_put_32 (abfd,
1832               (bfd_vma) (((extend & 0x1f) << 11)
1833                          | (extend & 0x7e0)
1834                          | (insn & 0x1f)),
1835               (bfd_byte *) data + reloc_entry->address);
1836
1837   ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1838                                        input_section, relocateable, data, gp);
1839
1840   final = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1841   bfd_put_16 (abfd,
1842               (bfd_vma) ((extend & 0xf800)
1843                          | ((final >> 11) & 0x1f)
1844                          | (final & 0x7e0)),
1845               (bfd_byte *) data + reloc_entry->address);
1846   bfd_put_16 (abfd,
1847               (bfd_vma) ((insn & 0xffe0)
1848                          | (final & 0x1f)),
1849               (bfd_byte *) data + reloc_entry->address + 2);
1850
1851   return ret;
1852 }
1853
1854 #undef GET_RELOC_ADDEND
1855 #undef SET_RELOC_ADDEND
1856 \f
1857 /* A mapping from BFD reloc types to MIPS ELF reloc types.  */
1858
1859 struct elf_reloc_map {
1860   bfd_reloc_code_real_type bfd_val;
1861   enum elf_mips_reloc_type elf_val;
1862 };
1863
1864 static const struct elf_reloc_map mips_reloc_map[] =
1865 {
1866   { BFD_RELOC_NONE, R_MIPS_NONE },
1867   { BFD_RELOC_16, R_MIPS_16 },
1868   { BFD_RELOC_32, R_MIPS_32 },
1869   /* There is no BFD reloc for R_MIPS_REL32.  */
1870   { BFD_RELOC_CTOR, R_MIPS_32 },
1871   { BFD_RELOC_64, R_MIPS_64 },
1872   { BFD_RELOC_16_PCREL, R_MIPS_PC16 },
1873   { BFD_RELOC_HI16_S, R_MIPS_HI16 },
1874   { BFD_RELOC_LO16, R_MIPS_LO16 },
1875   { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
1876   { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
1877   { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
1878   { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
1879   { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
1880   { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
1881   { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
1882   { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
1883   { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
1884   { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
1885   { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
1886   { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
1887   { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
1888   { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
1889   { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
1890   { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
1891   { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
1892   { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
1893   { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
1894   { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
1895   { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
1896   { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
1897   { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
1898   /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
1899   { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
1900   { BFD_RELOC_MIPS_JALR, R_MIPS_JALR }
1901 };
1902
1903 /* Given a BFD reloc type, return a howto structure.  */
1904
1905 static reloc_howto_type *
1906 bfd_elf32_bfd_reloc_type_lookup (abfd, code)
1907      bfd *abfd ATTRIBUTE_UNUSED;
1908      bfd_reloc_code_real_type code;
1909 {
1910   unsigned int i;
1911   /* FIXME: We default to RELA here instead of choosing the right
1912      relocation variant.  */
1913   reloc_howto_type *howto_table = elf_mips_howto_table_rela;
1914
1915   for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
1916        i++)
1917     {
1918       if (mips_reloc_map[i].bfd_val == code)
1919         return &howto_table[(int) mips_reloc_map[i].elf_val];
1920     }
1921
1922   switch (code)
1923     {
1924     case BFD_RELOC_MIPS16_JMP:
1925       return &elf_mips16_jump_howto;
1926     case BFD_RELOC_MIPS16_GPREL:
1927       return &elf_mips16_gprel_howto;
1928     case BFD_RELOC_VTABLE_INHERIT:
1929       return &elf_mips_gnu_vtinherit_howto;
1930     case BFD_RELOC_VTABLE_ENTRY:
1931       return &elf_mips_gnu_vtentry_howto;
1932     case BFD_RELOC_16_PCREL_S2:
1933       return &elf_mips_gnu_rela16_s2;
1934     default:
1935       bfd_set_error (bfd_error_bad_value);
1936       return NULL;
1937     }
1938 }
1939
1940 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
1941
1942 static reloc_howto_type *
1943 mips_elf_n32_rtype_to_howto (r_type, rela_p)
1944      unsigned int r_type;
1945      bfd_boolean rela_p;
1946 {
1947   switch (r_type)
1948     {
1949     case R_MIPS16_26:
1950       return &elf_mips16_jump_howto;
1951     case R_MIPS16_GPREL:
1952       return &elf_mips16_gprel_howto;
1953     case R_MIPS_GNU_VTINHERIT:
1954       return &elf_mips_gnu_vtinherit_howto;
1955     case R_MIPS_GNU_VTENTRY:
1956       return &elf_mips_gnu_vtentry_howto;
1957     case R_MIPS_GNU_REL16_S2:
1958       if (rela_p)
1959         return &elf_mips_gnu_rela16_s2;
1960       else
1961         return &elf_mips_gnu_rel16_s2;
1962     default:
1963       BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
1964       if (rela_p)
1965         return &elf_mips_howto_table_rela[r_type];
1966       else
1967         return &elf_mips_howto_table_rel[r_type];
1968       break;
1969     }
1970 }
1971
1972 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
1973
1974 static void
1975 mips_info_to_howto_rel (abfd, cache_ptr, dst)
1976      bfd *abfd;
1977      arelent *cache_ptr;
1978      Elf_Internal_Rela *dst;
1979 {
1980   unsigned int r_type;
1981
1982   r_type = ELF32_R_TYPE (dst->r_info);
1983   cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, FALSE);
1984
1985   /* The addend for a GPREL16 or LITERAL relocation comes from the GP
1986      value for the object file.  We get the addend now, rather than
1987      when we do the relocation, because the symbol manipulations done
1988      by the linker may cause us to lose track of the input BFD.  */
1989   if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
1990       && (r_type == (unsigned int) R_MIPS_GPREL16
1991           || r_type == (unsigned int) R_MIPS_LITERAL))
1992     cache_ptr->addend = elf_gp (abfd);
1993 }
1994
1995 /* Given a MIPS Elf_Internal_Rela, fill in an arelent structure.  */
1996
1997 static void
1998 mips_info_to_howto_rela (abfd, cache_ptr, dst)
1999      bfd *abfd ATTRIBUTE_UNUSED;
2000      arelent *cache_ptr;
2001      Elf_Internal_Rela *dst;
2002 {
2003   unsigned int r_type;
2004
2005   r_type = ELF32_R_TYPE (dst->r_info);
2006   cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, TRUE);
2007   cache_ptr->addend = dst->r_addend;
2008 }
2009 \f
2010 /* Determine whether a symbol is global for the purposes of splitting
2011    the symbol table into global symbols and local symbols.  At least
2012    on Irix 5, this split must be between section symbols and all other
2013    symbols.  On most ELF targets the split is between static symbols
2014    and externally visible symbols.  */
2015
2016 static bfd_boolean
2017 mips_elf_sym_is_global (abfd, sym)
2018      bfd *abfd ATTRIBUTE_UNUSED;
2019      asymbol *sym;
2020 {
2021   if (SGI_COMPAT (abfd))
2022     return (sym->flags & BSF_SECTION_SYM) == 0;
2023   else
2024     return ((sym->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
2025             || bfd_is_und_section (bfd_get_section (sym))
2026             || bfd_is_com_section (bfd_get_section (sym)));
2027 }
2028 \f
2029 /* Set the right machine number for a MIPS ELF file.  */
2030
2031 static bfd_boolean
2032 mips_elf_n32_object_p (abfd)
2033      bfd *abfd;
2034 {
2035   unsigned long mach;
2036
2037   /* Irix 5 and 6 are broken.  Object file symbol tables are not always
2038      sorted correctly such that local symbols precede global symbols,
2039      and the sh_info field in the symbol table is not always right.  */
2040   if (SGI_COMPAT (abfd))
2041     elf_bad_symtab (abfd) = TRUE;
2042
2043   mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
2044   bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
2045
2046   if (! ABI_N32_P(abfd))
2047     return FALSE;
2048
2049   return TRUE;
2050 }
2051 \f
2052 /* Support for core dump NOTE sections.  */
2053 static bfd_boolean
2054 elf32_mips_grok_prstatus (abfd, note)
2055      bfd *abfd;
2056      Elf_Internal_Note *note;
2057 {
2058   int offset;
2059   unsigned int raw_size;
2060
2061   switch (note->descsz)
2062     {
2063       default:
2064         return FALSE;
2065
2066       case 440:         /* Linux/MIPS N32 */
2067         /* pr_cursig */
2068         elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2069
2070         /* pr_pid */
2071         elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
2072
2073         /* pr_reg */
2074         offset = 72;
2075         raw_size = 360;
2076
2077         break;
2078     }
2079
2080   /* Make a ".reg/999" section.  */
2081   return _bfd_elfcore_make_pseudosection (abfd, ".reg", raw_size,
2082                                           note->descpos + offset);
2083 }
2084
2085 static bfd_boolean
2086 elf32_mips_grok_psinfo (abfd, note)
2087      bfd *abfd;
2088      Elf_Internal_Note *note;
2089 {
2090   switch (note->descsz)
2091     {
2092       default:
2093         return FALSE;
2094
2095       case 128:         /* Linux/MIPS elf_prpsinfo */
2096         elf_tdata (abfd)->core_program
2097          = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
2098         elf_tdata (abfd)->core_command
2099          = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
2100     }
2101
2102   /* Note that for some reason, a spurious space is tacked
2103      onto the end of the args in some (at least one anyway)
2104      implementations, so strip it off if it exists.  */
2105
2106   {
2107     char *command = elf_tdata (abfd)->core_command;
2108     int n = strlen (command);
2109
2110     if (0 < n && command[n - 1] == ' ')
2111       command[n - 1] = '\0';
2112   }
2113
2114   return TRUE;
2115 }
2116 \f
2117 /* Depending on the target vector we generate some version of Irix
2118    executables or "normal" MIPS ELF ABI executables.  */
2119 static irix_compat_t
2120 elf_n32_mips_irix_compat (abfd)
2121      bfd *abfd;
2122 {
2123   if ((abfd->xvec == &bfd_elf32_nbigmips_vec)
2124       || (abfd->xvec == &bfd_elf32_nlittlemips_vec))
2125     return ict_irix6;
2126   else
2127     return ict_none;
2128 }
2129 \f
2130 /* ECOFF swapping routines.  These are used when dealing with the
2131    .mdebug section, which is in the ECOFF debugging format.  */
2132 static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
2133   /* Symbol table magic number.  */
2134   magicSym,
2135   /* Alignment of debugging information.  E.g., 4.  */
2136   4,
2137   /* Sizes of external symbolic information.  */
2138   sizeof (struct hdr_ext),
2139   sizeof (struct dnr_ext),
2140   sizeof (struct pdr_ext),
2141   sizeof (struct sym_ext),
2142   sizeof (struct opt_ext),
2143   sizeof (struct fdr_ext),
2144   sizeof (struct rfd_ext),
2145   sizeof (struct ext_ext),
2146   /* Functions to swap in external symbolic data.  */
2147   ecoff_swap_hdr_in,
2148   ecoff_swap_dnr_in,
2149   ecoff_swap_pdr_in,
2150   ecoff_swap_sym_in,
2151   ecoff_swap_opt_in,
2152   ecoff_swap_fdr_in,
2153   ecoff_swap_rfd_in,
2154   ecoff_swap_ext_in,
2155   _bfd_ecoff_swap_tir_in,
2156   _bfd_ecoff_swap_rndx_in,
2157   /* Functions to swap out external symbolic data.  */
2158   ecoff_swap_hdr_out,
2159   ecoff_swap_dnr_out,
2160   ecoff_swap_pdr_out,
2161   ecoff_swap_sym_out,
2162   ecoff_swap_opt_out,
2163   ecoff_swap_fdr_out,
2164   ecoff_swap_rfd_out,
2165   ecoff_swap_ext_out,
2166   _bfd_ecoff_swap_tir_out,
2167   _bfd_ecoff_swap_rndx_out,
2168   /* Function to read in symbolic data.  */
2169   _bfd_mips_elf_read_ecoff_info
2170 };
2171 \f
2172 #define ELF_ARCH                        bfd_arch_mips
2173 #define ELF_MACHINE_CODE                EM_MIPS
2174
2175 /* The SVR4 MIPS ABI says that this should be 0x10000, but Irix 5 uses
2176    a value of 0x1000, and we are compatible.
2177    FIXME: How does this affect NewABI?  */
2178 #define ELF_MAXPAGESIZE                 0x1000
2179
2180 #define elf_backend_collect             TRUE
2181 #define elf_backend_type_change_ok      TRUE
2182 #define elf_backend_can_gc_sections     TRUE
2183 #define elf_info_to_howto               mips_info_to_howto_rela
2184 #define elf_info_to_howto_rel           mips_info_to_howto_rel
2185 #define elf_backend_sym_is_global       mips_elf_sym_is_global
2186 #define elf_backend_object_p            mips_elf_n32_object_p
2187 #define elf_backend_symbol_processing   _bfd_mips_elf_symbol_processing
2188 #define elf_backend_section_processing  _bfd_mips_elf_section_processing
2189 #define elf_backend_section_from_shdr   _bfd_mips_elf_section_from_shdr
2190 #define elf_backend_fake_sections       _bfd_mips_elf_fake_sections
2191 #define elf_backend_section_from_bfd_section \
2192                                         _bfd_mips_elf_section_from_bfd_section
2193 #define elf_backend_add_symbol_hook     _bfd_mips_elf_add_symbol_hook
2194 #define elf_backend_link_output_symbol_hook \
2195                                         _bfd_mips_elf_link_output_symbol_hook
2196 #define elf_backend_create_dynamic_sections \
2197                                         _bfd_mips_elf_create_dynamic_sections
2198 #define elf_backend_check_relocs        _bfd_mips_elf_check_relocs
2199 #define elf_backend_adjust_dynamic_symbol \
2200                                         _bfd_mips_elf_adjust_dynamic_symbol
2201 #define elf_backend_always_size_sections \
2202                                         _bfd_mips_elf_always_size_sections
2203 #define elf_backend_size_dynamic_sections \
2204                                         _bfd_mips_elf_size_dynamic_sections
2205 #define elf_backend_relocate_section    _bfd_mips_elf_relocate_section
2206 #define elf_backend_finish_dynamic_symbol \
2207                                         _bfd_mips_elf_finish_dynamic_symbol
2208 #define elf_backend_finish_dynamic_sections \
2209                                         _bfd_mips_elf_finish_dynamic_sections
2210 #define elf_backend_final_write_processing \
2211                                         _bfd_mips_elf_final_write_processing
2212 #define elf_backend_additional_program_headers \
2213                                         _bfd_mips_elf_additional_program_headers
2214 #define elf_backend_modify_segment_map  _bfd_mips_elf_modify_segment_map
2215 #define elf_backend_gc_mark_hook        _bfd_mips_elf_gc_mark_hook
2216 #define elf_backend_gc_sweep_hook       _bfd_mips_elf_gc_sweep_hook
2217 #define elf_backend_copy_indirect_symbol \
2218                                         _bfd_mips_elf_copy_indirect_symbol
2219 #define elf_backend_hide_symbol         _bfd_mips_elf_hide_symbol
2220 #define elf_backend_grok_prstatus       elf32_mips_grok_prstatus
2221 #define elf_backend_grok_psinfo         elf32_mips_grok_psinfo
2222 #define elf_backend_ecoff_debug_swap    &mips_elf32_ecoff_debug_swap
2223
2224 #define elf_backend_got_header_size     (4 * MIPS_RESERVED_GOTNO)
2225 #define elf_backend_plt_header_size     0
2226
2227 /* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations
2228    work better/work only in RELA, so we default to this.  */
2229 #define elf_backend_may_use_rel_p       1
2230 #define elf_backend_may_use_rela_p      1
2231 #define elf_backend_default_use_rela_p  1
2232 #define elf_backend_sign_extend_vma     TRUE
2233
2234 #define elf_backend_discard_info        _bfd_mips_elf_discard_info
2235 #define elf_backend_ignore_discarded_relocs \
2236                                         _bfd_mips_elf_ignore_discarded_relocs
2237 #define elf_backend_write_section       _bfd_mips_elf_write_section
2238 #define elf_backend_mips_irix_compat    elf_n32_mips_irix_compat
2239 #define elf_backend_mips_rtype_to_howto mips_elf_n32_rtype_to_howto
2240 #define bfd_elf32_find_nearest_line     _bfd_mips_elf_find_nearest_line
2241 #define bfd_elf32_new_section_hook      _bfd_mips_elf_new_section_hook
2242 #define bfd_elf32_set_section_contents  _bfd_mips_elf_set_section_contents
2243 #define bfd_elf32_bfd_get_relocated_section_contents \
2244                                 _bfd_elf_mips_get_relocated_section_contents
2245 #define bfd_elf32_bfd_link_hash_table_create \
2246                                         _bfd_mips_elf_link_hash_table_create
2247 #define bfd_elf32_bfd_final_link        _bfd_mips_elf_final_link
2248 #define bfd_elf32_bfd_merge_private_bfd_data \
2249                                         _bfd_mips_elf_merge_private_bfd_data
2250 #define bfd_elf32_bfd_set_private_flags _bfd_mips_elf_set_private_flags
2251 #define bfd_elf32_bfd_print_private_bfd_data \
2252                                         _bfd_mips_elf_print_private_bfd_data
2253 #define bfd_elf32_bfd_relax_section     _bfd_mips_relax_section
2254
2255 /* Support for SGI-ish mips targets using n32 ABI.  */
2256
2257 #define TARGET_LITTLE_SYM               bfd_elf32_nlittlemips_vec
2258 #define TARGET_LITTLE_NAME              "elf32-nlittlemips"
2259 #define TARGET_BIG_SYM                  bfd_elf32_nbigmips_vec
2260 #define TARGET_BIG_NAME                 "elf32-nbigmips"
2261
2262 #include "elf32-target.h"
2263
2264 /* Support for traditional mips targets using n32 ABI.  */
2265 #define INCLUDED_TARGET_FILE            /* More a type of flag.  */
2266
2267 #undef TARGET_LITTLE_SYM
2268 #undef TARGET_LITTLE_NAME
2269 #undef TARGET_BIG_SYM
2270 #undef TARGET_BIG_NAME
2271
2272 #define TARGET_LITTLE_SYM               bfd_elf32_ntradlittlemips_vec
2273 #define TARGET_LITTLE_NAME              "elf32-ntradlittlemips"
2274 #define TARGET_BIG_SYM                  bfd_elf32_ntradbigmips_vec
2275 #define TARGET_BIG_NAME                 "elf32-ntradbigmips"
2276
2277 /* Include the target file again for this target.  */
2278 #include "elf32-target.h"