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